【问题标题】:Why are RackMultipart* files persisting in my Rails /tmp directory?为什么 RackMultipart* 文件保留在我的 Rails /tmp 目录中?
【发布时间】:2011-01-04 02:41:25
【问题描述】:

我正在使用 Paperclip (2.3) 处理在 Ubuntu 上运行的 Rails 3.0.3 应用程序上的图像上传。 Paperclip 正在按照宣传的方式处理上传,但在应用程序的 /tmp 文件夹中创建的 RackMultipart* 文件仍然存在——也就是说,它们只是累积而不是自行删除。我意识到我可以使用 tmpreaper 删除旧的 tmpfiles,但我真的很想找到一个更优雅(和可扩展)的解决方案。

我之前遇到过临时文件(即 RackMultipart* 文件)累积在 Rails 应用程序的根目录(而不是 /tmp)中的问题。我通过在 environment.rb 文件中显式设置临时路径来解决这个问题,如下所示:

ENV['TMPDIR'] = Rails.root.join('tmp')

是否需要设置另一个环境变量以确保临时文件得到正确处理——即一旦它们被保存在模型中就被删除?我不确定这是否是 Paperclip 或我的 Rails 设置的问题。

我到处搜索,但在这方面进展甚微。如有任何线索,我将不胜感激。

真诚的感谢。

PS - 我目前正在使用 S3 进行存储。不过,这似乎与问题无关——我在本地存储文件时遇到了同样的问题。

【问题讨论】:

  • 现在我正在使用 cron 和 tmpreaper 处理临时文件问题。 CRON 每 10 分钟运行一次 tmpreaper 以清除我的 tmp 目录。仍然想要一个更优雅的修复,但这似乎现在有效。
  • 您使用的是什么服务器?也许是彪马?

标签: file-upload garbage-collection ruby-on-rails-3 paperclip tmp


【解决方案1】:

TempFileReaper 是用于处理此问题的 Rack 中间件。

http://www.rubydoc.info/github/rack/rack/Rack/TempfileReaper

在 application.rb 中包含这一行可以解决问题:

config.middleware.use Rack::TempfileReaper

【讨论】:

  • 这是正确的答案,因为这些临时文件是 Rack 的域(显然来自它们的文件名)。任何表单分段上传都会发生这种情况,而不仅仅是在使用 Paperclip 时。 TempfileReaper 中间件在 1.6.0 中被添加到 Rack 中,但 Rails 显然没有默认启用。
【解决方案2】:

我不知道这是否更优雅,但这是我在保存文件后所做的事情"

tempfile = params[:file].tempfile.path
if File::exists?(tempfile)
  File::delete(tempfile)
end

【讨论】:

【解决方案3】:

更新:问题应该在 rack-1.6.0.beta2 中得到解决。我看到它已经在 Rails 4.2.0.rc2 中使用了。

以下解决方法对我有用了将近一年:

我在接受文件上传的控制器操作的末尾添加了这个:

Thread.new { GC.start }

这会触发未使用的 Rack::Request 对象的垃圾收集,这也会删除关联的临时文件。请注意,它不会扫描 当前 请求的临时文件,但会删除以前的文件,并防止它们累积。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多