用户使用“另存为”时如何选择文件名?

时间:2011-08-21 19:57:48

标签: java google-app-engine servlets http-headers content-disposition

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

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

这会在浏览器中将其打开为文本文件,这正是我所需要的 但我也希望当用户使用浏览器的“save page as ..”选项时,它将提供初始名称“base.c”。 它只是在Firefox中执行(6),但它在chrome(15)和safari(5)上提供默认名称“download”。
更糟糕的是 - 当选择base.c作为文件名时,chrome会警告用户这是一个错误的扩展名并要求确认继续。
现在,如果我使用“附件”而不是“内联”,则不会打开文件,而是使用正确的名称下载该文件。

如何才能将默认保存为.. name为“base.c”? 这是浏览器的错误还是我滥用HTTP标头?

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

4 个答案:

答案 0 :(得分:3)

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

一个选项可能是通过使用web.xml中的url-pattern将URL从appspot / download?name = base.c更改为appspot.com/download/base.c。

e.g。

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我不确定这是否是一个真正的答案,但这可能会解决您的问题。您可以为用户提供在预览和下载之间进行选择的选项。这将解决您的问题

答案 3 :(得分:0)

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