2011-06-20 51 views
11

我的客户正尝试从黑莓手机和Android手机上传图像。他们不喜欢张贴表单参数或b)多部分消息。他们想要做的只是使用文件中的数据对URL进行POST。使用Carrierwave将原始文件上传到Rails

像这样的东西可以卷曲来完成: curl -d @google.png http://server/postcards/1/photo.json -X POST

我想上传的照片放入明信片模型的照片属性,并到正确的目录。

我在控制器中做这样的事情,但目录中的图像已损坏。我做的文件手动重命名为“PNG”现在:

def PostcardsController < ApplicationController 
... 
# Other RESTful methods 
... 
def photo 
    @postcard = Postcard.find(params[:id]) 
    @postcard.photo = request.body 
    @postcard.save 
end 

型号:

class Postcard < ActiveRecord::Base 
    mount_uploader :photo, PhotoUploader 
end 

回答

18

这是可以做到,但你仍然需要你的客户端发送的原始文件名(如果您对类型进行任何验证,则为内容类型)。

def photo 
    tempfile = Tempfile.new("photoupload") 
    tempfile.binmode 
    tempfile << request.body.read 
    tempfile.rewind 

    photo_params = params.slice(:filename, :type, :head).merge(:tempfile => tempfile) 
    photo = ActionDispatch::Http::UploadedFile.new(photo_params) 

    @postcard = Postcard.find(params[:id]) 
    @postcard.photo = photo 

    respond_to do |format| 
    if @postcard.save 
     format.json { head :ok } 
    else 
     format.json { render :json => @postcard.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

现在你可以设置使用

curl http://server/postcards/1/photo.json?filename=foo.png --data-binary @foo.png 

,并指定内容类型使用&type=image/png的照片。

+0

非常多,这正是我所需要的。小细节:新创建的照片(类UploadedFile)需要将“original_filename”设置为某种东西。即使它是虚拟数据,Carrierwave也希望有一些东西在那里。我的主要问题似乎是我的curl命令,因为我没有正确发送数据。 – jevy

+0

有人问我。对于curl命令,我使用了这个:'curl --form“image [[email protected];]”http:// server/images.json' – jevy

相关问题