2013-10-01 75 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