如何在Java中为大文件名正确设置HTTP Content-Disposition?

时间:2011-08-31 12:34:01

标签: java http content-disposition

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

  

Xxxxxxxxxxxxxxxxxx - Yyyyyyyyyy - Aaaaaaaaaa - Bbbbbbbb ccc Ddddddddddddddddd - abc1234560 - 2009-03-26 - 235959.pdf

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

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

例如

  

包含的短(长度<= 78个字符)参数值   只有非tspecials' characters SHOULD be represented as a single 令牌'。仅包含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);

2 个答案:

答案 0 :(得分:2)

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

第一个网址看起来像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中。我希望这也适用于长文件名。

答案 1 :(得分:1)

RFC 2183无关,RFC 6266是。

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