我正在进行的网站正在进行重新设计,因此我们的用户图像需要重新调整大小.该网站目前正在使用carrierwave gem处理所有图像和视频处理,每个图像都有一个原始文件,其文件名基于以下内容:
- def filename
- if original_filename
- if model && model.read_attribute(:user_image).present?
- model.read_attribute(:user_image)
- else
- @name ||= "#{secure_token}.#{file.extension}" if original_filename.present?
- end
- end
- end
和secure_token由.生成
- def secure_token
- var = :"@#{mounted_as}_secure_token"
- model.instance_variable_get(var) or model.instance_variable_set(var,SecureRandom.uuid)
- end
为此执行创建的任务是:
- ##
- # CarrierWave Amazon S3 File Reprocessor Rake Task
- #
- # Written (specifically) for:
- # - CarrierWave
- # - Ruby on Rails 3
- # - Amazon S3
- #
- # Works with:
- # - Any server of which you have write-permissions in the Rails.root/tmp directory
- # - Works with Heroku
- #
- # Not tested with,but might work with:
- # - Ruby on Rails 2
- #
- # Might work with,after a couple of tweaks:
- # - File System Storage
- # - Cloud Files Storage
- # - GridFS
- #
- # Examples:
- #
- # Reprocess all versions of User#avatar
- # rake carrierwave:reprocess class=User mounted_uploader=avatar
- #
- # Reprocess the versions: thumb,small,medium for User#avatar
- # rake carrierwave:reprocess class=User mounted_uploader=avatar versions='thumb,medium'
- #
- # Reprocess for an underlying association,for things like Embedded MongoDB Documents
- # which are models you cannot access directly,but rather through a regular Document
- #
- # Embeds One (picture) Association
- # rake carrierwave:reprocess class=User association=picture mounted_uploader=image versions='thumb,medium'
- #
- # Embeds Many (pictures) Association
- # rake carrierwave:reprocess class=User association=pictures mounted_uploader=image versions='thumb,medium'
- #
- # WARNING
- # There is an issue with "Rake",that you cannot name your mounted_uploader "file".
- # If you do this,then you will not be able to reprocess images through this rake task
- # class User
- # include Mongoid::Document
- # mount_uploader :file,PictureUploader
- # end
- #
- # This will NOT work with reprocessing through Rake because the mounted_uploader uses the "file" attribute.
- namespace :carrierwave do
- ##
- # Only tested with Amazon S3 Storage
- # Needs some minor modifications if you want to use this for File System Store,Cloud Files and GridFS probably.
- # This should work without Ruby on Rails as well,just set a different TMP_PATH.
- desc "Reprocesses Carrier Wave file versions of a given model."
- task :reprocess => :environment do
- ##
- # Load in the OPEN URI library to be able
- # to pull down and store the original file in a temp directory
- require 'open-uri'
- ##
- # Default constants
- TMP_PATH = "#{Rails.root}/tmp/carrierwave"
- ##
- # Set environment constants
- CLASS = ENV['class'].capitalize
- ASSOCIATION = ENV['association'] || nil
- MOUNTED_UPLOADER = ENV['mounted_uploader'].to_sym
- VERSIONS = ENV['versions'].nil? ? Array.new : ENV['versions'].split(',').map {|version| version.strip.to_sym}
- ##
- # Find the Model
- MODEL = Kernel.const_get(CLASS)
- ##
- # Create the temp directory
- %x(mkdir -p "#{TMP_PATH}")
- ##
- # Find all records for the provided Model
- records = MODEL.all
- ##
- # Output to console
- puts "\nCarrier Wave Version Reprocessing!"
- puts "======================================="
- puts "Model: #{CLASS}"
- puts "Mounted Uploader: #{MOUNTED_UPLOADER}"
- puts "Association: #{ASSOCIATION}" if ASSOCIATION
- puts "Versions: #{VERSIONS.empty? ? "all" : VERSIONS.join(',')}\n\n"
- ##
- # Run through all records
- records.each do |record|
- ##
- # Set the mounted uploader object
- # If it has a one-to-one association (singular) then that object
- # will be returned and wrapped in an array so we can "iterate" through it below.
- #
- # If it has a one-to-many association then it will return the array of associated objects
- #
- # If no association is specified,it assumes the amounted uploader is attached to the specified CLASS
- if ASSOCIATION
- if ASSOCIATION.singular?
- objects = [record.send(ASSOCIATION)]
- else
- objects = record.send(ASSOCIATION)
- end
- else
- objects = [record]
- end
- ##
- # Iterates through the objects
- objects.each do |object|
- ##
- # Returns the mounted uploader object
- mounted_object = object.send(MOUNTED_UPLOADER)
- ##
- # Retrieve Filename
- filename = mounted_object.path.split('/').last
- ##
- # Output to console
- puts "Reprocessing: #{filename}"
- ##
- # Read out the original file from the remote location
- # and write it out to the temp directory (TMP_PATH)
- # This file will be used as the base file to reprocess
- # the versions. Once all versions have been processed,# this temp file will be directly removed.
- open(mounted_object.url) do |original_object|
- File.open(File.join(TMP_PATH,filename),'w') do |temp_file|
- temp_file.write(original_object.read)
- end
- end
- ##
- # By default it will add all available versions to the versions variable
- # which means that all available versions will be reprocessed.
- # If the "versions" argument has been provided,then only the specified
- # version(s) will be set to the versions variable,and thus,only these
- # will be reprocessed.
- versions = mounted_object.versions.map {|version| version[0]}
- versions = VERSIONS unless VERSIONS.empty?
- ##
- # Reprocesses the versions
- versions.each do |version|
- mounted_object.send(version).cache!(File.open(File.join(TMP_PATH,filename)))
- mounted_object.send(version).store!
- end
- ##
- # Removes the temp file
- %x(rm "#{TMP_PATH}/#{filename}")
- end
- end
- end
- end
问题是,虽然它创建新图像,但文件以新文件名保存,而不是遵循图像上传器中列出的命名,因此网站无法找到它们.以下是如何存储图像的示例.
它应该如何:
原始档案:
fdk392ks93_39ei.png
缩略图版本:
thumb_fdk392ks93_39ei.png
怎么样:
原始档案:
fdk392ks93_39ei.png
缩略图版本:
thumb_fajeilkadifej_jakdjfi.png
任何帮助将非常感激.
其他信息:
型号:用户
解决方法
在调用recreate_versions之后!你得打电话保存!在模型上.您可以查看
this question,其中有人问基本相同的事情.