我使用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目录吗?
我发现这篇文章here但是也无法理解,并且没有简单的例子说明
修改
我尝试使用控制台
运行此命令CarrierWave.clean_cached_files!
它输出一个tmp目录中所有文件的数组,如下所示:
["/home/medBo/projects/my_project/public/uploads/tmp/1380732930-5006-6671","/home/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 :(得分:8)
您是否尝试过调用
CarrierWave.clean_cached_files!
在您的代码中或从rails控制台手动?它有用吗?如果是这样,您可以将其置于日常任务中。您可以使用whenever gem之类的内容。它看起来像:
every 1.day, :at => '4:30 am' do
runner "CarrierWave.clean_cached_files!"
end
答案 1 :(得分:3)
当一切正常时,CarrierWave会为您整理大部分tmp文件和文件夹。要捕获异常,请创建一个自定义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时设置了一个很棒的railscast。 http://railscasts.com/episodes/164-cron-in-ruby-revised
答案 2 :(得分:0)
参考CarrierWave API文档:
clean_cached_files!(秒= 60 * 60 * 24)
Object删除超过一天的缓存文件。
如果您在控制台上执行此操作,只需将较低的值传递给方法,例如
CarrierWave.clean_cached_files! 1
在这里阅读更多内容: http://www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave/Uploader/Cache/ClassMethods