1

我在 AppEngine 数据存储上实现了基本的文件上传/下载。
我想要的功能是将名为“base.c”的文件作为文本文件打开。所以我做了以下事情:(
当然我的代码是针对一般情况的,但是这个具体的例子说明了这个问题)

resp.setContentType("text/plain");
resp.setHeader("Content-Disposition", "inline; filename=base.c");

这将在浏览器中将其作为文本文件打开,这正是我所需要的。
但我也希望当用户使用浏览器的“将页面另存为..”选项时,它将提供“base.c”的初始名称。它在 Firefox (6) 中就是这样做的,但它在 chrome(15) 和 safari(5) 上给出了“下载”的默认名称。
Even worse - when choosing base.c as the file name chrome warns the user that this is the wrong extension and asks for confirmation to continue.
现在,如果我使用“附件”而不是“内联”,它不会打开文件,而是用正确的名称下载它。

我该怎么做才能使默认另存为..名称为“base.c”?
这是浏览器的错还是我滥用了 HTTP 标头?

(如果有任何帮助,所有测试都在 OSX 10.6 上,下载站点属于:http:
//------.appspot.com/download?name=base.c

4

4 回答 4

3

我认为大多数浏览器默认将页面名称作为另存为选项的当前页面。

一种选择可能是通过使用 web.xml 中的 url 模式将 URL 从appspot/download?name=base.c 更改为appspot.com/download/base.c。

例如

<servlet-mapping>
  <servlet-name>download</servlet-name>
  <url-pattern>/download/*</url-pattern>
</servlet-mapping>

然后解析 URL 以从数据存储中获取文件名。

如果这不适用于 GAE,我很抱歉,我不熟悉它。

于 2011-08-21T20:12:02.143 回答
2

这是一个已知的问题; 请参阅http://greenbytes.de/tech/tc2231/#inlwithasciifilename - 只有 FF 才能做到这一点。

于 2011-09-02T14:52:02.100 回答
0

我不确定这是否是实际答案,但这可能会解决您的问题。您可以让用户在预览和下载之间进行选择。这将解决您的问题

于 2011-08-21T20:03:12.713 回答
0

您不应该期望该filename论点会因 .Content-Disposition以外的任何值而受到尊重attachment。正如@scott 建议的那样,您最好的选择是修改您的 URL 映射,以便 URL 路径以您想要的文件名结尾;这对用户来说也更友好。您可以结合使用的另一个选项是在 HTML 页面中显示格式化的文件,并带有发送的“原始”下载链接,Content-Disposition: attachment就像 GitHub 所做的那样。

于 2011-08-22T00:28:02.217 回答