我正在尝试在rails应用程序中提供动态生成的文件,因此当用户单击特定链接时,将生成该文件并使用send_data将其发送到客户端。
该文件无意重复使用:是一个简短的文本文件,重新生成应该非常便宜,因为它不会被大量删除;但如果有必要或方便我可以将它存储在数据库中,所以只生成一次。
首先,我想在内存中生成文件,并将其发送到控制器中。我试图存档这样的东西:
def DownloadsController < ApplicationController
def project_file
project = Project.find(params[:id])
send_data project.generate_really_simply_text_file_report
end
end
但我不知道如何在内存中生成流,因此文件系统中没有创建文件。
另一种选择是在rails app tmp目录中生成一个随机名称的文件并从中发送,但文件将保留在那里,这是我不希望发生的事情。
编辑:如果我没有弄错,send_file会阻止请求直到文件被发送,所以它可以工作......
还有其他建议或意见吗?
提前致谢
答案 0 :(得分:19)
如果你描述它是一个简单的问题,那么这样的简单解决方案就可以了。只是不要忘记:filename
选项,否则文件将被命名为“project_file”。
def project_file
project = Project.find(params[:id])
send_data project.generate_really_simply_text_file_report, :filename => "#{project.name}.txt"
end
修改强>
你的project#generate_really_simply_text_file_report
应该返回二进制数据,文件的路径或原始字符串。
def download
content = "chunky bacon\r\nis awesome"
send_data content, :filename => "bacon.txt"
end