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

File upload 为什么RackMultipart*文件会持久保存在我的Rails/tmp目录中?,file-upload,garbage-collection,ruby-on-rails-3,paperclip,tmp,File Upload,Garbage Collection,Ruby On Rails 3,Paperclip,Tmp,我正在使用回形针(2.3)在运行于Ubuntu的Rails 3.0.3应用程序上处理图像上传。Paperclip正在按照广告处理上传,但在应用程序的/tmp文件夹中创建的RackMultipart*文件仍然存在——也就是说,它们只是累积而不是删除自己。我意识到我可以使用tmpreaper删除旧的tmpfiles,但我真的很想找到一个更优雅(和可伸缩)的解决方案 我以前遇到过一个问题,即在Rails应用程序的根目录(而不是/tmp)中积累临时文件(即RackMultipart*文件)。我通过在en

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

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

ENV['TMPDIR'] = Rails.root.join('tmp')
是否需要设置另一个环境变量,以确保正确处理tempfiles,即在模型中保存tempfiles后将其删除?我不确定这是回形针还是Rails设置的问题

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

衷心感谢


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

我不知道这是否再优雅了,但这就是我在保存文件后所做的。”


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

以下变通方法在近一年的时间里为我提供了良好的服务:

我在接受文件上载的控制器操作末尾添加了以下内容:

Thread.new { GC.start }

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

TempFileReaper被认为是处理此问题的机架中间件

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

config.middleware.use Rack::TempfileReaper

目前,我正在使用cron和tmpreaper处理tempfile问题。cron每10分钟运行一次tmpreaper以清除我的tmp目录。我仍然希望有一个更优雅的修复程序,但这似乎目前正在运行。您使用的是哪台服务器?可能是Puma?Rack-devel组中的一个相关线程:我看到创建了两个相同的临时文件,如上所示只删除其中一个()这是正确的答案,因为这些临时文件是Rack的域(显然是从它们的文件名)。任何形式的多部分上传都会发生这种情况,不仅仅是在使用曲别针时。TempfileReaper中间件在1.6.0中添加到Rack中,但显然Rails没有默认启用。
config.middleware.use Rack::TempfileReaper