设置从浏览器下载的文件的名称

时间:2012-08-21 17:30:19

标签: ruby-on-rails ruby-on-rails-3 http-headers httpresponse content-disposition

免责声明我知道Content-Disposition标头要发送回客户端以设置下载的文件名 - 但是我的问题比这更复杂

我有一个应用程序(RubyOnRails使用rails 3.1.3),它本质上是一个文档搜索/视图应用程序(搜索文档然后在浏览器中呈现它们)。这是使用iframe完成的。

<iframe src="<%= @frameURL %>" width="100%" height="100%">

@frameURL是对Documents控制器的plugin函数的调用。插件函数对我们的后端API进行RESTful调用以检索引用的文档,然后将文档内容发送回浏览器以在iframe内进行渲染。

这适用于JPEG,PDF,TXT等文档。但是,当浏览器不知道如何处理内容类型(如word文档 - 我们运行Mac OS-X) - 然后浏览器下载返回的文件为plugin.doc&lt; - 请注意,这不会设置Content-Disposition标头。

由于我们希望在需要下载文件时对其进行适当命名,因此我们设置了Content-Disposition标头:

response.headers['Content-Disposition'] = "attachment; filename.extension"

现在文件被下载为filename.doc - 但是,使用此标头集,甚至可以下载浏览器可以在内部呈现的JPEG等文件。

问题:

  1. 当我们没有设置Content-Disposition标头时,是否有人知道rails或浏览器的名称是plugin.extension

  2. 有没有办法设置Content-Disposition但是只有在浏览器无法呈现文档时才应用它 - 所以默认应该是浏览器处理它所能做的一切,作为后备,浏览器使用Content-Disposition内容,用于命名下载的文件。

  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 如果您正在调用某些Rails函数,例如“send_file”,那么请搜索您的Rails版本的源代码,以查找该函数的源代码并查看它设置的标题。您必须按照几个级别跟随调用堆栈,但您应该能够找到它如何设置标题;我之前做过这个。至于浏览器,我认为如果它在Content-Disposition标题中找不到文件名,它或多或少会使用URL的最后一部分作为文件名。
  2. 尝试在标题中使用“内联”代替“附件”。