【问题标题】:Uploading a raw file to Rails using Carrierwave使用 Carrierwave 将原始文件上传到 Rails
【发布时间】:2011-06-20 18:45:35
【问题描述】:

我的客户正在尝试从 Blackberry 和 Android 手机上传图片。他们不喜欢发布 a) 表单参数或 b) 多部分消息。他们想要做的是只使用文件中的数据对 url 进行 POST。

这样的事情可以在 curl 中完成: 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

【问题讨论】:

    标签: ruby-on-rails-3 carrierwave


    【解决方案1】:

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

    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
    

    要指定内容类型,请使用&amp;type=image/png

    【讨论】:

    • 这正是我所需要的。次要细节:新创建的照片(属于 UploadedFile 类)需要将“original_filename”设置为某些内容。即使是虚拟数据,Carrierwave 也希望有一些东西存在。我的主要问题似乎是我的 curl 命令,因为我没有正确发送数据。
    • 有人问我。对于 curl 命令,我使用了这个:curl --form "image[file=@realimage.png;]" http://server/images.json
    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 2016-04-05
    • 2018-04-18
    • 1970-01-01
    • 2011-04-24
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多