如何在rails应用程序中发送动态生成的文件

时间:2010-02-04 11:36:05

标签: ruby-on-rails file dynamic-data

我正在尝试在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会阻止请求直到文件被发送,所以它可以工作......

还有其他建议或意见吗?

提前致谢

1 个答案:

答案 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