我有一个Redmine插件。我在tmp中创建了一个临时文件,然后用File.open发送。我想在用户下载后删除这个临时文件。我怎么做呢?
我的代码(在一个控制器中)。
File.open(filelocation, 'r') do |file|
send_file file, :filename => filename, :type => "application/pdf", :disposition => "attachment"
end
如果我在File.open之后删除文件,那就不行了。
编辑
在我的控制器中,我做到了。
def something
temp = Tempfile.new(['PDF_','.pdf'])
# ... some code that modify my pdf ...
begin
File.open(temp.path, 'r') do |file|
send_file file, :filename => temp.path, :type => "application/pdf", :disposition => "attachment"
end
ensure
temp.close
temp.unlink
end
end
我的临时文件被删除了,但不是在我的代码结束: File.open返回一个损坏的PDF。
我使用send_data代替send_file,然后我删除文件。send_data会阻塞,直到数据被发送,允许File.delete请求成功。
file = temp.path
File.open(file, 'r') do |f|
send_data f.read.force_encoding('BINARY'), :filename => filename, :type => "application/pdf", :disposition => "attachment"
end
File.delete(file)
来源:Ruby on Rails 在Ruby on Rails中,在send_file方法之后,从服务器上删除文件。
呼叫 send_file 可以卸载到Web服务器,因此它可以异步返回。在tempfile块中做任何事情都是危险的,同时也要尝试关闭和解除文件的链接。当使用send_file时,唯一的选择就是放弃清理web进程中的临时文件。
可以考虑使用 Tempfile
类的工作。
Tempfile.create('foo', '/tmp') do |f|
... do something with f ...
end
它包含在标准库中,当块被关闭时,清理工作会自动进行。
参考文献。http:/www.ruby-doc.orgstdlib-2.1.1libdoctempfilerdocindex.html