2012-10-18 47 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 

我認爲這是唯一正確的辦法重新命名文件。