12

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

4

3 回答 3

12

TempFileReaper是用来处理这个问题的 Rack 中间件。

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

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

config.middleware.use Rack::TempfileReaper
于 2015-07-02T15:04:12.800 回答
5

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

tempfile = params[:file].tempfile.path
if File::exists?(tempfile)
  File::delete(tempfile)
end
于 2011-03-11T20:20:43.260 回答
0

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

以下解决方法为我服务了将近一年:

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

Thread.new { GC.start }

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

于 2014-01-07T14:21:12.123 回答