2012-10-18 43 views
4

我无法弄清楚如何在rails 3.2.6中更新/重命名使用Carrierwave-mongoid上载/管理的文件。我想重命名db中的文件以及文件系统中的文件。如何更新/重命名carrierwave上传的文件?

像这样的事情也许......

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 

让我补充这是它已经被上传后。

回答

0

我用于再处理上传的图片此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是否需要 不同的东西。
+0

谢谢,我能够得到下面的答案工作,让我知道你的想法,欣赏它。 – user892583

+0

也适用于mongoid。 – Mic92

4

我能够得到以下工作,但我确信有一种更优雅的方式。我会很感激以下

任何评论*将它添加到应用程序/上传/ 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 

谢谢!

+0

杜!这实际上是从缓存中存储两次文件!并从move_to一次。 – user892583

+0

我需要将先前上传的文件的格式转换为.jpg,然后获取carrierwave以将其视为上传的文件。您的代码放在SanitizedFile.new的正确路径上,我调用转换/重命名的文件使其与我的模型相关联。我发现我需要调用recreate_versions!保存模型后才能正确生成版本。 –

1

基于@ user892583,我的工作就可以了,并用一个简单的解决方案提出了:

def rename!(new_name) 
    new_path = File.join(File.dirname(file.file), new_name) 
    file.move_to(new_path) 
end 
0

我这样做是用这种方式:

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 

我认为这是唯一正确的办法重新命名文件。