停止Ruby on Rails删除由上传创建的机架多部分文件

时间:2010-11-09 00:57:27

标签: ruby-on-rails rack

在Rails中上载文件时,它会在/ tmp文件夹中创建机架多部分文件。

RackMultipart20101109-31106-ylgoz0-0

请求完成后,我使用delayed_job进行首先处理,然后将此tmp文件上传到Amazon S3。

当全新上传时,rails(或rack)偶尔会删除这些文件时,问题就开始了。

我的服务器正在处理1-1000 MB范围内的文件的并行上传,并且在将文件上传到S3之前,文件会被删除。

有没有办法阻止导轨(或机架)删除这些文件?其他解决方案也欢迎。

1 个答案:

答案 0 :(得分:2)

刚遇到同样的问题,这个SO question的答案给出了一些线索。最重要的是:

  

据我所知,或者   找,直到没有物理文件   读取上传。

最初我的代码是:

# In my controller:
Delayed::Job.enqueue(FileJob.new(params[:id], params[:upload].path))

# And In lib/file_job.rb
class FileJob < Struct.new(:file_id, :log_file) 
  def perform
    File.open(log_file)
    # Do important stuff with the incoming file.
  end
end

所以,如果我们刚刚将文件处理转移到delayed_job而另一个请求在之前进入我们的delayed_job有机会执行并读取文件... Puff,我们的文件似乎在有机会被访问之前被删除,因此不会创建任何物理文件。

我对此问题的解决方法如下:

# In my controller:
FileUtils.copy_entry(params[:upload].path, params[:upload].path + "B")
Delayed::Job.enqueue(FileJob.new(params[:id], params[:upload].path + "B"))

# And In lib/file_job.rb
class FileJob < Struct.new(:file_id, :log_file) 
  def perform
    File.open(log_file)
    # Do important stuff with the incoming file.
    FileUtils.remove(log_file)
  end
end

我立即在控制器中复制了该文件,该文件阻止该方法来自另一个传入请求。然后我将新路径传递给我的delayed_job,最终需要在完成复制后清理复制的文件。

这个修补程序似乎对我有用,但我想上面的解决方案对于非常大的文件不会很好。我希望能够更好地了解rails和文件在读取之前不存在的情况。