在Rails中上载文件时,它会在/ tmp文件夹中创建机架多部分文件。
RackMultipart20101109-31106-ylgoz0-0
请求完成后,我使用delayed_job进行首先处理,然后将此tmp文件上传到Amazon S3。
当全新上传时,rails(或rack)偶尔会删除这些文件时,问题就开始了。
我的服务器正在处理1-1000 MB范围内的文件的并行上传,并且在将文件上传到S3之前,文件会被删除。
有没有办法阻止导轨(或机架)删除这些文件?其他解决方案也欢迎。
答案 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和文件在读取之前不存在的情况。