base64使用stringIO上传的图片carrierwave gem在rails上传时会损坏

时间:2013-04-23 13:52:45

标签: ruby-on-rails ruby-on-rails-3 carrierwave

这就是我正在做的事情:

在控制器中: -

    dataurl = params[:dataURL]
    io = FilelessIO.new(Base64.decode64(dataurl))
    io.original_filename = "foobar.jpeg"
    io.content_type = "image/jpeg"
    p = SketchilyTest.new
    p.image = io
    p.save    

型号: -

class FilelessIO < StringIO
    attr_accessor :original_filename
    attr_accessor :content_type
end
class SketchilyTest < ActiveRecord::Base
  attr_accessible :desc, :image
  mount_uploader :image, BaseSixtyfourEncodedUploader

end

BaseSixtyfourEncodedUploader是carrierwave gem的简单上传器

问题是我没有收到任何错误,图片上传但是已损坏。

当我尝试在浏览器中打开它时,我收到此错误:

The image “http://localhost:3000/uploads/sketchily_test/image/41/foobar.jpeg” cannot be displayed because it contains errors.

另请注意,我可以从我的数据库中的base64_encoded数据重新生成图像。但无法将其保存为带载波的jpeg图像。

1 个答案:

答案 0 :(得分:2)

图像表示为:

data:image/jpeg;base64,/9jblablablabla

使用 regexp 获取值 data:image/jpeg/9jblablablabla

image/jpeg将是您的文件类型

/9jblablablabla将是图片的表示

解码错误的源可能会导致图像文件损坏。 然后,您可以使用FileTemp来创建和保存文件。希望它也帮助别人..

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html