使用CarrierWave上传RESTful文件

use*_*154 6 ruby rest file-upload ruby-on-rails carrierwave

我正在尝试为文件上传构建API后端.我希望能够使用具有Base64编码的文件字符串的POST请求上传文件.服务器应解码字符串,并使用CarrierWave保存文件.这是我到目前为止所拥有的:

photo.rb:

class Photo
  include Mongoid::Document
  include Mongoid::Timestamps
  mount_uploader :image_file, ImageUploader
end
Run Code Online (Sandbox Code Playgroud)

image_uploader.rb:

class ImageUploader < CarrierWave::Uploader::Base
  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end
Run Code Online (Sandbox Code Playgroud)

Rails控制台:(摘要)

ruby-1.8.7-p334 :001 > img = File.open("../image.png") {|i| i.read}
 => "\377???JFIF\000\001\002\001\000H\000H\000\000\377?Photoshop 3.0\0008BIM\003...
ruby-1.8.7-p334 :003 >   encoded_img = Base64.encode64 img
=> 3af8A\nmLpplt5U8q+a7G2...
ruby-1.8.7-p334 :005 >   p = Photo.new
 => #<Photo _id: 4e21b9a31d41c817b9000001, created_at: nil, updated_at: nil, _type: nil, user_id: nil, image_file_filename: nil> 
ruby-1.8.7-p334 :006 > p.user_id = 1
 => 1 
ruby-1.8.7-p334 :007 > p.image_file = Base64.decode64 encoded_img
\255??=\254\200?7u\226???\230?-zh?wT\253%????\036?s\232Is?M\215???6\247\256\177...
ruby-1.8.7-p334 :008 > p.save
 => true 
ruby-1.8.7-p334 :009 > p.image_file.url
 => nil 
Run Code Online (Sandbox Code Playgroud)

充分

该问题似乎与将Base64解码的字符串转换为文件的过程有关.CarrierWave似乎期待一个File对象,而我给它一个String.那么如何将该String转换为File对象.我希望这种转换不是为文件系统保存任何东西,只需创建对象并让CarrierWave完成剩下的工作.

Zac*_*ker 24

CarrierWave也接受一个StringIO,但它需要一个original_filename方法,因为它需要它来确定文件名并进行扩展检查.如何在Rails 2和3之间进行更改,这里有两种方法:

Rails 2

io = StringIO.new(Base64.decode64(encoded_img))
io.original_filename = "foobar.png"

p.image_file = io
p.save
Run Code Online (Sandbox Code Playgroud)

在Rails 3,您需要一个新的类,然后手动添加original_filename

class FilelessIO < StringIO
    attr_accessor :original_filename
end

io = FilelessIO.new(Base64.decode64(encoded_img))
io.original_filename = "foobar.png"

p.image_file = io
p.save
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,你不是猴子修补StringIO,你正在创建一个继承自StringIO的新类,并添加了一个额外的属性original_filename.根本不是猴子补丁. (4认同)