2011-10-01 11 views

Odpowiedz

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

Jak zapisać plik za pośrednictwem sterownika? Czy masz do tego próbkę? – fabian

1

Przyjęta odpowiedź nie sprawdziła się (v0.9). Wygląda na to, że czek nie powiedzie się przed wywołaniem wywołania bufora podręcznego.

Ta implementacja działa:

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