整洁的/ tmp时由send_file结束(clean /tmp when send_file is

2019-10-19 19:17发布

我有一个管理平台的插件。 我在/ 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。

Answer 1:

考虑使用Tempfile对你的工作类:

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

在标准库和清理时,该块被关闭自动出现它包括在内。

参考: http://www.ruby-doc.org/stdlib-2.1.1/libdoc/tempfile/rdoc/index.html



Answer 2:

我用的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的,由send_file方法后删除服务器上的文件



文章来源: clean /tmp when send_file is over
标签: ruby redmine