如何在Rails中通过请求保留临时文件?
问题描述:
在我的Rails应用程序中,用户可以上传Excel文件。在我的模型存在使用attachment_fu像这样一类的importfile:如何在Rails中通过请求保留临时文件?
class ImportFile < ActiveRecord::Base
has_attachment :storage => :file_system, :path_prefix => 'public/imports', :max_size => 10.megabytes
end
当用户点击“添加文件”,他进入一个网页,一个<%= fields.file_field:uploaded_data%>。 attachment_fu做它的工作和文件上传正在完成(让我们省略验证问题)。我想保留这个文件以备将来使用,将上传的文件复制到其他临时文件中。临时文件工作正常 - 我可以在磁盘上看到它。
def self.write_to_tmp(data)
temp_file = Tempfile.new("import", "#{Rails.root}/tmp")
begin
temp_file.write(data)
ensure
temp_file.close(false)
end
temp_file
end
我想要做的是显示用户预览,然后让他选择,如果他想添加一个文件或放弃它 - 有两个按钮。当用户选择保存文件时,我遇到了问题,因为上面刚创建的临时文件已经消失。它在请求前被删除。
有没有人有提示如何实现这个?或者可以指向我上传与预览文件场景,就像我已经预见的那样?我一直在寻找几天,但我没有找到一个。
答
这种事最可靠的方法是创建一个简单的“上传”跟踪模型,就像你在那里,但使用Paperclip来代替。这可以配置为处理大量的文件。
您需要实际保存这些记录以使它们在请求之间保持不变。这将导致孤立的记录,但是一个简单的cron作业或rake任务可以在任何需要的时候关闭所有未使用的文件。
在单个目录中创建大量文件通常是一个坏主意。回形针有一个路径参数,将您的ID号分成几部分,所以记录#903132进入.../90/31/32例如。
保留常规附件,如果他们想丢弃它,请将其删除,否则使用它。稍后清理掉所有未使用的附件。
感谢您的提示 - 这很有帮助。如果我决定拥有一些孤儿记录,我不必切换到Paperclip,因为attachment_fu也是。 – 2010-11-16 20:52:55