我已在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)
答案 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一样。