使用carrierwave清理tmp目录

我使用carrierwave上传我的图片,在我的表单中我添加了一个隐藏的字段用于缓存,如文档中所述。

= 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目录吗?

我在这里发现了这篇文章,但也无法理解,并没有解释简单的例子

编辑

我试着用控制台运行这个命令

 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文件。 在这种情况下,您最好创建一个定期清理tmp文件夹的rake任务。

是什么意思:“这种方法打破了有多个版本的上传者”? (因为我在我的上传器类“拇指和大版本”中使用了两个版本):

 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 

当一切正常工作时,CarrierWave将为您整理大部分tmp文件和文件夹。 要捕获exception,请创建一个自定义rake任务来清理垃圾,然后使用Whenever gem来安排此任务每天,每小时等运行。

my_custom_task.rake

 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调用

Ryan Bates在使用rails时设置了很棒的轨道广播。 http://railscasts.com/episodes/164-cron-in-ruby-revised

你试过打电话吗?

 CarrierWave.clean_cached_files! 

在您的代码中或从rails控制台手动? 它有用吗? 如果是这样,您可以将其置于日常任务中。 你可以使用像gem这样的东西。 它看起来像:

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

参考CarrierWave API文档:

clean_cached_files!(秒= 60 * 60 * 24)

对象删除超过一天的缓存文件。

如果您在控制台上执行此操作,只需将较低的值传递给方法,例如

 CarrierWave.clean_cached_files! 1 

在这里阅读更多内容: http : //www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave/Uploader/Cache/ClassMethods