2013-10-01 110 views
4

我使用carrierwave進行圖片上傳,在我的表單中,我添加了一個隱藏字段來進行緩存,如文檔中所述。用carrierwave清理tmp目錄

= form_for @user, html: {multipart: true} do |f| 
%p 
    = f.label :image, "your image" 
    = f.file_field :image, id: "img" 
    = f.hidden_field :image_cache 

但問題是上傳圖像和保存記錄後,tmp目錄仍然具有所有臨時/緩存文件。

有一種方法可以清理tmp目錄嗎?

我發現這個職位here,但不能把它理解爲好,並沒有簡單的例子來說明

編輯

我試圖用控制檯運行此命令

CarrierWave.clean_cached_files! 

它輸出我在tmp目錄中的所有文件的數組,如下所示:

["/home/medBo/projects/my_project/public/uploads/tmp/1380732930-5006-6671","/hom‌​e/medBo/projects/my_project/public/uploads/tmp/1380754280-4623-3698" .... 

但是當我去看看發生了什麼,我發現所有的文件仍然在/ tmp目錄(不刪除)

我試圖瞭解更多在上面的鏈接存在,我發現了一個特殊的考慮有關CarrierWave.clean_cached_files !

特別注意事項

這種方法打破了有不止一個版本中定義上傳。 您的第一個版本將被保存,但之後清理代碼將 運行並刪除用於生成其他 版本的tmp文件。在這種情況下,您最好創建一個rake任務, 定期清理tmp文件夾。

這意味着什麼:「這種方法打破了不止一個版本的上傳者」? (因爲我用我上傳類兩個版本的「拇指和大型版本」):

class ImageUploader < CarrierWave::Uploader::Base 

    # Include RMagick or MiniMagick support: 
    include CarrierWave::RMagick 
    # include CarrierWave::MiniMagick 

    # Choose what kind of storage to use for this uploader: 
    storage :file 
    # storage :fog 

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 
    ... 
    ... 
    version :large do 
    resize_to_limit(600, 600) 
    end 

    version :thumb do 
    process :crop_image 
    resize_to_fill(100, 100) 
    end 
... 
... 
end 

我也嘗試運行任務,看看tmp目錄/目錄裏面的文件夾會被刪除,但任務無法正常工作:

task :delete_tmp_files do 
    FileUtils.rm_rf Dir.glob("#{Rails.root}/public/uploads/tmp/*") 
end 
+0

讓我看看我能找到。 – jcm

回答

4

當一切工作正常時,CarrierWave將負責整理大部分tmp文件和文件夾。要捕捉異常,請創建一個自定義rake任務來清理垃圾,然後使用Whenever Gem來安排此任務每天運行,每個小時等。

my_custom_task。耙

task :delete_tmp_files do 
    FileUtils.rm_rf Dir.glob("#{Rails.root}/where/you/store/your/tmp_images/*") #public/tmp/screenshots etc 
    #note the asterisk which deletes folders and files whilst retaining the parent folder 
end 

電話與rake delete_tmp_files

瑞恩·貝茨已經做了很大的railscast在軌道建立時。 http://railscasts.com/episodes/164-cron-in-ruby-revised

+0

我可以在控制檯的最後回答中嘗試一下你的命令嗎?我的文件在/ public/uploads/tmp和裏面的/ tmp目錄有很多文件夾,其中包含兩個版本的圖像上傳 – medBo

+0

當我運行FileUtils.rm_rf Dir.glob(「#{Rails.root}/public/uploads/tmp它執行任何操作,我想是因爲你的命令嘗試直接在/ tmp中刪除文件,但在我的情況下,我在/ tmp中有很多文件夾:( – medBo

+0

有一個命令刪除tmp目錄中的文件夾而不是文件? – medBo

7

你有沒有打過電話

CarrierWave.clean_cached_files! 

在你的代碼或手動從鐵軌控制檯?它有用嗎?如果是這樣,你可以把它放在日常任務中。你可以使用類似whenever gem的東西。它看起來像這樣:

every 1.day, :at => '4:30 am' do 
    runner "CarrierWave.clean_cached_files!" 
end 
+0

嗨@jcm非常感謝你試圖幫助我:)我在控制檯嘗試了你的命令它輸出了一個路徑文件在tmp目錄中的數組,如下所示:[「/ home/medBo/projects/my_project/public/uploads/tmp/1380732930-5006-6671「,」/ home/medBo/projects/my_project/public/uploads/tmp/1380754280-4623-3698「....但仍然在tmp目錄中的文件沒有被刪除 – medBo

+0

我編輯我的問題 – medBo

+0

請看看這個http://stackoverflow.com/questions/16138617/rake-aborted-operation-not-permitted-carrierwave-delete-tmp-files-that-failed,似乎這個問題是我的,但我有一些難以理解的 – medBo