2011-10-01 72 views

回答

6
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

1

接受的答案並不適用於我(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