使用base64图像与Carrierwave

6

我想要用Carrierwave完成类似于base64照片和纸夹-Rails的事情。请问有人能够解释一下如何在Carrierwave中使用base64图片吗?

2个回答

7
class ImageUploader < CarrierWave::Uploader::Base

  class FilelessIO < StringIO
    attr_accessor :original_filename
    attr_accessor :content_type
  end

  before :cache, :convert_base64

  def convert_base64(file)
    if file.respond_to?(:original_filename) &&
        file.original_filename.match(/^base64:/)
      fname = file.original_filename.gsub(/^base64:/, '')
      ctype = file.content_type
      decoded = Base64.decode64(file.read)
      file.file.tempfile.close!
      decoded = FilelessIO.new(decoded)
      decoded.original_filename = fname
      decoded.content_type = ctype
      file.__send__ :file=, decoded
    end
    file
  end

5
我如何通过控制器保存文件?你有这方面的示例吗? - fabian

2
接受的答案对我没有用(v0.9)。 它似乎是在缓存回调之前失败的检查。
这个实现有效:
class ImageUploader < CarrierWave::Uploader::Base

  # Mimick an UploadedFile.
  class FilelessIO < StringIO
    attr_accessor :original_filename
    attr_accessor :content_type
  end

  # Param must be a hash with to 'base64_contents' and 'filename'.
  def cache!(file)
    if file.respond_to?(:has_key?) && file.has_key?(:base64_contents) && file.has_key?(:filename)
      local_file = FilelessIO.new(Base64.decode64(file[:base64_contents]))
      local_file.original_filename = file[:filename]
      extension = File.extname(file[:filename])[1..-1]
      local_file.content_type = Mime::Type.lookup_by_extension(extension).to_s
      super(local_file)
    else
      super(file)
    end
  end

end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接