在Ruby on Rails中,在send_file方法之后从服务器中删除该文件
我使用以下代码在Rails中发送文件。
如果File.exist?(file_path) send_file(file_path,type:'text / excel') File.delete(FILE_PATH) 结束
在这里,我试图发送文件,并在成功发送后从服务器中删除该文件。 但我面临的问题是,删除操作是在发送执行时执行的,由于我在浏览器中没有看到任何内容。
所以在Rails中有任何方法,一旦send_file操作完成,从服务器删除文件。
任何有关这方面的帮助将受到高度赞赏。
谢谢,
阿赫亚
因为您正在使用send_file
,Rails会将请求传递给您的HTTP服务器(nginx,apache等 – 请参阅有关X-Sendfile头的send_file上的Rails文档 )。 因此,当您尝试删除文件时,Rails不知道它仍在使用中。
您可以尝试使用send_data
,它将阻塞直到数据发送,从而允许您的File.delete
请求成功。 请记住, send_data
需要数据流作为其参数,而不是路径,因此您需要先打开文件:
File.open(file_path, 'r') do |f| send_data f.read, type: "text/excel" end File.delete(file_path)
另一个选项是后台作业,定期检查要删除的临时文件。
如果您正在生成要尝试发送的文件,则解决方案是使用Tempfile
类:
begin # The second argument is optional: temp_file = Tempfile.new(filename, temp_directory) # ... edit temp_file as needed. # By default, temp files are 0600, # so this line might be needed depending on your configuration: temp_file.chmod(0644) send_file temp_file ensure temp_file.close end
与此问题中指出的相反,这可以按预期工作(文件在服务器上停留的时间足够长,但最终会被删除); 这篇文章似乎表明这是由于Rails 3.2.11中的更新,我无法validation。
这适合我! 使用send_data
您可以在发送之前删除文件。
file = File.open(Rails.root.join('public', 'uploads', filename), "rb") contents = file.read file.close File.delete(filepath) if File.exist?(filepath) send_data(contents, :filename => filename)
- Rails和MySQL – ActiveRecord :: ConnectionNotEstablished在生产环境中
- Heroku和Rails:Postgres的Gem加载错误,但它在GEMFILE中指定
- 音乐播放器选择一些歌曲并在rails中播放
- 如何将Monitor对象传递给Ruby中的两个线程对象?
- TypeError – 没有将nil隐式转换为String Sinatra
- Ruby:在代码中使用rand(),但编写测试来validation概率
- Rails:模型上的动态列/属性?
- 如果评估的Last语句是If语句,则返回Ruby中的内容
- 我应该何时在Cucumber和RSpec工作流程中单独测试视图?