我无法弄清楚如何更新/重命名/上传的文件在轨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
让我补充这是它已经被上传后。
我能得到以下的工作,但我敢肯定有一个更优雅的方式。 我会很感激在以下任何评论
*将它添加到应用程序/上传/ 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 /任务文件夹。
- 这是使用活动记录,如果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
的宝石。