использовать изображение base64 с Carrierwave - PullRequest
6 голосов
/ 01 октября 2011

Я хочу выполнить то же самое, что и base64 photo and paperclip -Rails , но с Carrierwave. Кто-нибудь может объяснить мне использование изображений base64 в Carrierwave?

Ответы [ 2 ]

7 голосов
/ 26 октября 2011
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
2 голосов
/ 12 февраля 2014

Принятый ответ у меня не сработал (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
...