2016-07-29 183 views
1

我上传文件Carrierwave丢弃元数据在上传

# encoding: utf-8 

class EngagementUploader < CarrierWave::Uploader::Base 

    # Include RMagick or MiniMagick support: 
    include CarrierWave::RMagick 
    include CarrierWave::Processing::RMagick 
    # include CarrierWave::MiniMagick 
    include CarrierWave::ImageOptimizer 

    # Choose what kind of storage to use for this uploader: 
    # storage :file 
    storage :fog 

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: #{model.name.to_s.underscore} 
    def store_dir 
    "#{model.class.to_s.pluralize.parameterize}/#{model.id}/" 
    end 

    process :optimize => [{ quality: 90 }] 

    #process :watermark 

    #process :blur => [0, 8] 

    # Provide a default URL as a default if there hasn't been a file uploaded: 
    # def default_url 
    # # For Rails 3.1+ asset pipeline compatibility: 
    # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) 
    # 
    # "/images/fallback/" + [version_name, "default.png"].compact.join('_') 
    # end 

    # Process files as they are uploaded: 
    # process :scale => [200, 300] 
    # 
    # def scale(width, height) 
    # # do something 
    # end 

    # Create different versions of your uploaded files: 
    # version :thumb do 
    # process :resize_to_fit => [50, 50] 
    # end 
    # version :large do 
    # process :resize_to_fill => [512, 512] 
    # end 
    # version :medium do 
    # process :resize_to_fill => [128, 128] 
    # end 
    # version :small do 
    # process :resize_to_fill => [48, 48] 
    # end 
    # version :tiny do 
    # process :resize_to_fill => [32, 32] 
    # end 

    # Add a white list of extensions which are allowed to be uploaded. 
    # For images you might use something like this: 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 

    # Override the filename of the uploaded files: 
    # Avoid using model.id or version_name here, see uploader/store.rb for details. 
    # def filename 
    # "something.jpg" if original_filename 
    # end 

    def filename 
    if original_filename 
     "post-#{secure_token(16)}.#{file.extension}" 
    end 
    end 

    protected 
    def secure_token(length=16) 
    var = :"@#{mounted_as}_secure_token" 
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2)) 
    end 

    # def watermark 
    # manipulate! do |img| 
    #  logo = Magick::Image.read("#{Rails.root}/app/assets/images/watermark.png").first 
    #  img = img.composite(logo, Magick::SouthEastGravity, 15, 15, Magick::OverCompositeOp) 
    # end 
    # end 

end 

我上传360图像,当我尝试读取从uploade元文件一切都失去了。上传时有没有办法保留它?

回答

1

随便搜索返回Gem Carrierwave-meta。基本上,添加到您的gemfile:

gem 'carrierwave-meta' 

然后运行bundle install。然后store_meta选项添加到您的上传:

class TestUploader < CarrierWave::Uploader::Base 

    include CarrierWave::RMagick 
    include CarrierWave::Meta 

    process :store_meta => [{md5sum: true}] 
    version :version do 
    process :resize_to_fill => [200, 200] 
    process :store_meta 
    end 
end 

file = File.open('test.jpg') # JPEG 500x300, 20000 bytes 
uploader = TestUploader.new 
uploader.store!(file) 

uploader.width  # 500 
uploader.height  # 300 
uploader.image_size # [500, 300] 

当然,你需要确保你的模型可以存储值:

class TestModel 
    attr_accessor :image_width 
    attr_accessor :image_height 
    attr_accessor :image_image_size 
    attr_accessor :image_content_type 
    attr_accessor :image_file_size 
    attr_accessor :image_md5sum 

    attr_accessor :image_version_width 
    attr_accessor :image_version_height 
    attr_accessor :image_version_image_size 
    attr_accessor :image_version_content_type 
    attr_accessor :image_version_file_size 
    attr_accessor :image_version_md5sum 
end 
+0

我并不需要元数据本身。它必须嵌入到Image中的meta标签中才能被Facebook识别。 –

+0

啊,我误解了。那我真的不能告诉你。 –