当send_file结束时清理临时文件

问题描述 投票:1回答:3

我有一个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。

ruby redmine
3个回答
0
投票

我使用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方法之后,从服务器上删除文件。


0
投票

呼叫 send_file 可以卸载到Web服务器,因此它可以异步返回。在tempfile块中做任何事情都是危险的,同时也要尝试关闭和解除文件的链接。当使用send_file时,唯一的选择就是放弃清理web进程中的临时文件。


-1
投票

可以考虑使用 Tempfile 类的工作。

Tempfile.create('foo', '/tmp') do |f|
   ... do something with f ...
end

它包含在标准库中,当块被关闭时,清理工作会自动进行。

参考文献。http:/www.ruby-doc.orgstdlib-2.1.1libdoctempfilerdocindex.html

© www.soinside.com 2019 - 2024. All rights reserved.