为什么RackMultipart *文件持久存在于我的Rails / tmp目录中?

时间:2011-01-04 02:41:26

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

我正在使用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进行存储。这似乎与问题无关 - 我在本地存储文件时遇到了同样的问题。

3 个答案:

答案 0 :(得分:11)

TempFileReaper 是Rack中间件,可以解决此问题。

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

在application.rb中包含这一行解决了这个问题:

config.middleware.use Rack::TempfileReaper

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

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

以下解决方法在我工作了近一年:

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

Thread.new { GC.start }

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