【发布时间】:2011-10-06 19:48:17
【问题描述】:
我正在尝试为文件上传构建 API 后端。我希望能够使用具有 Base64 编码的文件字符串的 POST 请求上传文件。服务器应解码字符串,并使用 CarrierWave 保存文件。到目前为止,这是我所拥有的:
照片.rb:
class Photo
include Mongoid::Document
include Mongoid::Timestamps
mount_uploader :image_file, ImageUploader
end
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
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
问题似乎与将 Base64 解码字符串转换为文件的过程有关。 CarrierWave 似乎需要一个 File 对象,而我却给它一个字符串。那么如何将该 String 转换为 File 对象。我希望这种转换不会将任何内容保存到文件系统中,只需创建对象并让 CarrierWave 完成剩下的工作。
【问题讨论】:
-
我知道这与您所要求的不同,但我放弃了 Paperclip 和 CarrierWave 以支持极其强大的 DragonFly。查看“使用访问器”下的markevans.github.com/dragonfly/file.Models.html。
-
@kain 我现在正在使用carrierwave.. 想了解更多关于蜻蜓的体验
-
出于某种原因,每次我使用 Paperclip 和 CarrierWave 时,我都会使用自定义补丁,尤其是 Paperclip。 DragonFly 允许在没有先例的情况下进行自定义,而无需修补任何东西,而且它的工作坚如磐石。非平凡的配置很难设置,但一旦你掌握了,你就可以做任何事情。例子?我的应用程序需要 robust 和 real mime 类型,因为它们也写在远程存储标头上。查看我的门票:bit.ly/pSv6EE
-
谢谢,是的.. 我也不得不修补carrierwave来解决一些烦人的事情
标签: ruby-on-rails ruby rest file-upload carrierwave