我已经在AppEngine数据存储上实现了一个基本的文件上传/下载。
我想要的功能是一个名为"base.c"的文件将作为文本文件打开。所以我做了以下操作:
(当然,我的代码是针对一般情况,但这个特定的例子说明了问题)
resp.setContentType("text/plain");
resp.setHeader("Content-Disposition", "inline; filename=base.c");
这将在浏览器中以文本文件的形式打开它,这正是我所需要的。
但我也希望,当用户使用浏览器的"保存页面为.."选项,它将提供"base.c"的初始名称。它只是在firefox(6),但它给出的默认名称为"下载"在chrome(15)和safari(5)。
更糟糕的是,当选择base.c作为文件名时,chrome警告用户这是错误的扩展名,并要求用户确认是否继续。
现在,如果我使用"attachment"而不是"inline",它不会打开文件,而是以右名称下载。
我怎么做才能使默认保存为..名字是"base。c"?
这是浏览器的错误还是我滥用HTTP头?
(如果有帮助的话,所有测试都是在OSX 10.6上进行的,下载站点是这样的:
http ://------. appspot.com/download ? name = base.c)
我认为大多数浏览器默认将页面名称作为另存为选项的当前页面。
一个选项可能是通过使用web.xml中的URL -pattern将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中工作,我很抱歉,我不熟悉它。
这是一个已知问题;
我不确定这是否是一个实际的答案,但这可能解决你的问题。您可以让用户选择预览还是下载。这将解决您的问题
您不应该期望Content-Disposition
的filename
参数被attachment
以外的任何值所尊重。你最好的选择,正如@scott建议的那样,是修改你的URL映射,使URL路径以你想要的文件名结束;这对用户来说也更友好。另一个可以同时使用的选项是在HTML页面中显示格式化的文件,带有发送Content-Disposition: attachment
的"原始"下载链接,就像GitHub一样。