如何更新/重命名carrierwave上传的文件?
我无法弄清楚如何在rails 3.2.6中更新/重命名使用Carrierwave-mongoid上传/管理的文件。 我想重命名数据库中的文件以及文件系统。
这样的事可能……
def rename( id , new_name ) f = UploadedFile.find(id) if f.update_attributes({ f.file.original_filename: new_name }) # this is WRONG, what is right??? new_path = File.join( File.dirname( f.file.current_path ) , new_name )) FileUtils.mv( f.file.current_path , new_path ) end return f end
让我添加它是在它已经上传之后。
我能够得到以下工作,虽然我确信有更优雅的方式。 我对以下任何评论表示感谢
*将此添加到app / uploaders / file_uploader.rb
def rename(new_name) sf = model.file.file new_path = File.join( File.dirname( sf.file ) , "#{new_name}#{File.extname( sf.file )}") new_sf = CarrierWave::SanitizedFile.new sf.move_to(new_path) model.file.cache!(new_sf) model.save! return model end
谢谢!
在我的上传器文件中修改版本设置(文件名和图像大小)后,我使用此rake任务重新处理上传的图像:
# Usage: rake carrierwave:reprocess class=Model namespace :carrierwave do task :reprocess => :environment do CLASS = ENV['class'].capitalize MODEL = Kernel.const_get(CLASS) records = MODEL.all records.each do |record| record.photo.recreate_versions! if record.photo? end end end
笔记:
- 将“照片”替换为您命名为上传者的内容。
- Rake任务进入lib / tasks文件夹。
- 这是使用Active Record,不确定Mongoid是否需要不同的东西。
基于@ user892583,我研究了它并提出了一个更简单的解决方案:
def rename!(new_name) new_path = File.join(File.dirname(file.file), new_name) file.move_to(new_path) end
我这样做了:
def filename if !cached? && file.present? new_filename = 'foobar' new_path = File.join(File.dirname(file.path), new_filename) file.move_to(new_path) recreate_versions! new_filename else super end end
我认为这只是重命名文件的正确方法。
最有效的方法是移动现有的S3对象(假设您的存储层是S3):
def rename(new_name) bucket_name = "yourapp-#{Rails.env}" resource = Aws::S3::Resource.new bucket = resource.bucket(bucket_name) object = bucket.object(path) new_filename = "#{new_name}#{File.extname(path)}" new_path = File.join(File.dirname(path), new_filename) object.move_to(bucket: bucket_name, key: new_path) model.update_column(mounted_as, new_filename) model.reload # Now call `recreate_versions!(*versions.keys)` # if you want versions updated. Explicitly passing # versions will prevent the base version getting # reuploaded. model end
这是使用aws-sdk-s3
gem。