1

我已经在AppEngine数据存储之上实现了基本的文件上传/下载。
我想要的功能是名为“base.c”的文件将作为文本文件打开。 所以我做了以下内容:
(当然我的代码是一般情况下,但是这个具体的例子说明了这个问题)如何在用户使用“另存为”时选择文件名?

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

这将打开它在浏览器中的文本文件,这是我需要的。
但我也希望当用户使用浏览器的“保存页面作为..”选项时,它将提供“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。

例如

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

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

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

+0

文件系统上没有实际的静态文件。它由servlet从数据存储中输出。 – Danish94

+0

对不起,我不熟悉GAE。您是否尝试过在web.xml配置中使用url-pattern?我编辑了我的答案 – scott

+2

@丹尼斯:这一定是有效的。你只需要通过'request.getPathInfo()。substring(1)'而不是'request.getParameter(“name”)'来获取文件名。另请参阅http://balusc.blogspot.com/2007/07/fileservlet.html。 – BalusC

0

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

相关问题