2

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

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

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

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

这对于 JPEG、PDF、TXT 等文档非常有效。但是,当浏览器不知道如何处理内容类型时(如 word 文档 - 我们运行 Mac OS-X) - 然后浏览器下载返回的文件如plugin.doc <- 注意这是没有设置 Content-Disposition 标头。

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

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

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

问题:

  1. plugin.extension当我们不设置 Content-Disposition 标头时,有谁知道 rails 或浏览器在哪里获取名称?

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

谢谢!

4

1 回答 1

1
  1. 如果您正在调用诸如“send_file”之类的 Rails 函数,则搜索您的 Rails 版本的源代码以找到该函数的源代码并查看它设置的标头。您必须将调用堆栈向下跟踪几级,但您应该能够找出它是如何设置标头的;我以前做过。至于浏览器,我认为如果它在 Content-Disposition 标头中找不到文件名,它将或多或少地使用 URL 的最后一部分作为文件名。
  2. 尝试在标题中使用“内联”而不是“附件”。
于 2012-08-21T20:19:13.977 回答