有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何设置ContentDisposition标头中包含空格的文件名

我有一段代码:

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

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

我们如何解决这个问题


共 (4) 个答案

  1. # 1 楼答案

    使用引号:

    resp.addHeader("Content-Disposition", "inline; filename=\"" + fileName + "\"");
    
  2. # 2 楼答案

    需要执行以下步骤:

    • 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

    成功地测试了

    • 火狐✔
    • 铬✔
    • 边缘✔
    • Internet Explorer✔
  3. # 3 楼答案

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

    resp.addHeader("Content-Disposition", "inline; filename=" + chr(34) + fileName + chr(34));
    
  4. # 4 楼答案

    根据the HTTP standard,用双引号包围字符串,并通过在引号或反斜杠之前加一个反斜杠来转义其中的任何引号或反斜杠

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

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