【问题标题】:How to choose the file name when user uses "save as"?用户使用“另存为”时如何选择文件名?
【发布时间】:2011-10-31 17:28:56
【问题描述】:

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

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

这将在浏览器中将其作为文本文件打开,这正是我所需要的。
但我也希望当用户使用浏览器的“将页面另存为..”选项时,它将提供“base.c”的初始名称。 在 firefox 中就是这样做的(6),但它在 chrome(15) 和 safari(5) 上给出了“下载”的默认名称。
甚至更糟糕 - 选择Base.cas.C作为文件名Chrome警告用户这是错误的扩展并要求确认继续。
现在,如果我使用“附件”而不是“内联”,它不会打开文件,而是使用 right 名称下载它。

如何使默认另存为..名称为“base.c”?
这是浏览器的错还是我滥用了 HTTP 标头?

(如果有帮助,所有测试均在 OSX 10.6 上进行,下载站点为:
http://------.appspot.com/download?name=base.c

【问题讨论】:

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


    【解决方案1】:

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

    一种选择可能是通过使用 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,我很抱歉,我不熟悉它。

    【讨论】:

    • 文件系统上没有实际的静态文件。它由数据存储中的 servlet 输出。
    • 对不起,我对 GAE 不熟悉。您是否尝试过在 web.xml 配置中使用 url 模式?我已经编辑了我的答案
    • @Danish:这必须有效。您只需要通过request.getPathInfo().substring(1) 而不是request.getParameter("name") 获取文件名。另请参阅balusc.blogspot.com/2007/07/fileservlet.html
    • 它让我几乎找到了正确的位置,但现在默认文件名为“base”(并保存为 base.txt)
    • @Danish - 您可以尝试注释掉 content-disposition 标头以查看是否有效,因为您没有强制另存为?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-23
          • 1970-01-01
          • 2011-03-14
          • 1970-01-01
          • 2011-01-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多