【问题标题】:cleanup tmp directory with carrierwave使用carrierwave清理tmp目录
【发布时间】:2013-10-01 21:43:58
【问题描述】:

我使用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","/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

【问题讨论】:

  • 让我看看我能找到什么。

标签: ruby-on-rails carrierwave


【解决方案1】:

你有没有试过打电话

CarrierWave.clean_cached_files!

在您的代码中还是从 Rails 控制台手动?它奏效了吗?如果是这样,您可以将其放入日常任务中。你可以使用whenever gem 之类的东西。它看起来像:

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

【讨论】:

  • 嗨@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 目录中删除
  • 请看这个stackoverflow.com/questions/16138617/…,好像这个问题和我的一样,但是我有些看不懂
【解决方案2】:

当一切正常时,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

【讨论】:

  • 我可以在控制台的最后一个答案中尝试你的命令吗?我的文件在 /public/uploads/tmp 和 /tmp 目录里面有很多文件夹,其中包含上传的两个版本的图像
  • 当我运行 FileUtils.rm_rf Dir.glob("#{Rails.root}/public/uploads/tmp 它会做任何事情,我认为因为你的命令试图直接删除 /tmp 中的文件,但是就我而言,我在 /tmp 中有很多文件夹 :(
  • 有一个命令可以删除 tmp 目录中的文件夹而不是文件?
  • 您可以保留目录本身,只删除其内容,方法是添加“”:FileUtils.rm_rf(Dir.glob('dir/to/remove/') )
  • 但是目录很多很多,每次创建缓存都会创建一个目录,里面有文件,想象一下长时间后会创建多少目录
【解决方案3】:

参考 CarrierWave API 文档:

clean_cached_files!(秒 = 60*60*24)

Object 删除超过 1 天的缓存文件。

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

CarrierWave.clean_cached_files! 1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多