53

我有这段代码:

resp.addHeader("Content-Disposition", "inline; filename=" + fileName);

当文件名为“a_b_c.doc”或“abc.doc”时,下载文件的名称会正确显示。但是,当文件名为“abc .doc”时,下载文件的名称仅为“a”。

我们如何解决这个问题?

4

4 回答 4

85

使用引号:

resp.addHeader("Content-Disposition", "inline; filename=\"" + fileName + "\"");
于 2013-09-05T10:50:57.643 回答
15

根据HTTP 标准,您可以用双引号将字符串括起来,并通过在它们前面加上一个反斜杠来转义其中的任何引号或反斜杠。

Content-Disposition: attachment; filename="Very \"interesting\" file \\ files.txt"

这将提示另存为Very "interesting" file \ files.txt. 请注意,反斜杠的存在并不表示文件夹,它表明反斜杠是文件名的一部分(这在 Linux 和其他一些平台上完全有效,但在 Windows 上无效。)

于 2016-07-12T09:10:00.567 回答
3

需要以下步骤:

  • 对文件名进行 URI 编码
  • 替换编码文件名中的空格(我们使用 URL 编码器而不是 URI 编码器,但 URL 编码使用+编码空间而不是%20,因此我们需要手动将它们替换为%20)。
  • 在 header 中设置编码文件名。这里我们有两种变体:一种指定编码,另一种不指定。为了获得最大的兼容性,我们可以同时指定两者。

代码:

String fileName = ...;
String encodedFileName = URLEncoder.encode(fileName, 
    StandardCharsets.UTF_8.name()).replace("+", "%20");

response.setHeader("Content-Disposition", 
    String.format("inline; filename*=UTF-8''%1$s; filename=%1$s", encodedFileName));

示例标题: inline; filename*=UTF-8''Hello%20World.doc; filename=Hello%20World.doc

已成功测试

  • 火狐✔</li>
  • 铬✔</li>
  • 边缘✔</li>
  • Internet Explorer ✔</li>
于 2019-07-24T11:02:49.230 回答
0

如果你引用你的文件名,chr(34)它将起作用:

resp.addHeader("Content-Disposition", "inline; filename=" + chr(34) + fileName + chr(34));
于 2015-07-29T18:45:45.943 回答