【问题标题】:How do I correctly set the HTTP Content-Disposition for large file names in Java?如何正确设置 Java 中大文件名的 HTTP Content-Disposition?
【发布时间】:2011-11-07 14:07:53
【问题描述】:

我正在处理一些要求,这些要求将导致从 J2EE Web 服务器下载任意 PDF 文件。名称可能如下所示:

Xxxxxxxxxxxxxxxxxxx - Yyyyyyyyyy - Aaaaaaaaaaa - Bbbbbbbb ccc Dddddddddddddd - abc1234560 - 2009-03-26 – 235959.pdf

现在我已经阅读了 RFC2183 中的几个部分:

http://www.ietf.org/rfc/rfc2183.txt

例如

一个短(长度 tspecials' characters SHOULD be represented as a single token'。仅包含 ASCII 字符的短参数值, 但包括tspecials' characters, SHOULD be represented as quoted-string'。参数值超过 78 个字符,或 包含非 ASCII 字符,必须按照 [RFC 2184]。

等等等等。如果我没有通读所有这些 RFC,那么现在有数百万的事情会出错……或者我选择了一个处理此类 RFC 规范的库。 Java有这样的东西吗?或者我是偏执狂,实际上只需将此标头写入输出流就足够了:

String filename = "\"" + filename.replace("\"", "\\\"") + "\"";
addHeader("Content-Disposition", "attachment; filename=" + filename);

【问题讨论】:

    标签: java http content-disposition


    【解决方案1】:

    我过去遇到过类似的问题,并找到了以下解决方案。

    第一个 URL 看起来像 http://myhost.com/file/1234 其中 1234 是文件 ID。假设文件名应该是my-very-long-file-name.pdf。因此,不要设置 HTTP 标头,而是将调用重定向到像

    这样的 URL

    http://myhost.com/download/1234/my-very-long-file-name.pdf

    映射到/download/ 的 sevlet 将从 URL 获取 ID 并将文件打印到其输出流。但是浏览器会从 URL 中提取文件名并提供下载和保存文件,因为它的名称在 URL 中。我希望这也适用于长文件名。

    【讨论】:

    • 这是个好主意。不幸的是,出于安全原因,我们使用 URL 加密,因此该 URL 对应用程序不可用...:-/
    • +1 我也是这样做的,因为浏览器对 RFC2183/RFC2184 的支持充其量是很差的,这是让非 ascii 名称在所有浏览器中工作的唯一方法。
    • 非 ASCII 名称在除 Safari(和古老的 IE)之外的所有浏览器中的工作方式都相同
    【解决方案2】:

    RFC 2183 不相关,RFC 6266 是。

    此外,78 个字符的限制仅适用于电子邮件,不适用于 http,因此您不必担心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2015-05-12
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      相关资源
      最近更新 更多