如何在Content-Disposition标头中设置包含空格的文件名

时间:2013-09-05 10:49:31

标签: java servlets download filenames

我有这段代码:

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

当文件名是" a_b_c.doc"或" abc.doc"正确显示下载文件的名称。但是,当文件名是" a b c .doc"下载文件的名称仅为" a"。

我们如何解决这个问题?

4 个答案:

答案 0 :(得分:62)

使用引号:

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

答案 1 :(得分:10)

根据the HTTP standard,您使用双引号括起字符串,并通过在其前面加上一个反斜杠来转义任何引号或反斜杠。

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

需要执行以下步骤:

  • URI编码文件名
  • 替换编码文件名中的空格(我们使用的是URL编码器而不是URI编码器,但是URL编码使用%20作为编码空间而不是%20,因此我们需要用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

示例标题: {{1}}

通过

成功测试
  • Firefox✔
  • Chrome浏览器✔
  • Edge✔
  • Internet Explorer✔