How to set filename containing spaces in Content-Disposition header

后端 未结 4 1028
情话喂你
情话喂你 2020-12-09 14:20

I have this piece of code:

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

When the file name is \"a_b_c.doc\" o

相关标签:
4条回答
  • 2020-12-09 14:58

    Use quotes:

    resp.addHeader("Content-Disposition", "inline; filename=\"" + fileName + "\"");
    
    0 讨论(0)
  • 2020-12-09 15:05

    if you quote your filename with chr(34) it will work:

    resp.addHeader("Content-Disposition", "inline; filename=" + chr(34) + fileName + chr(34));
    
    0 讨论(0)
  • 2020-12-09 15:06

    According to the HTTP standard you surround the string with double-quotes, and escape any quotes or backslashes within by preceding them with a single backslash.

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

    This will prompt to save as Very "interesting" file \ files.txt. Note that the presence of a backslash does not suggest a folder, it suggests the backslash is part of the filename (which is perfectly valid on Linux and some other platforms, but not on Windows.)

    0 讨论(0)
  • 2020-12-09 15:12

    Following steps are required:

    • URI-encode the filename
    • Replace the spaces in the encoded filename (we're using an URL encoder instead of URI encoder, but URL encoding uses + as encoded space instead of %20, so we need to manually replace them with %20).
    • Set the encoded file name in the header. Here we have two variants: one which specifices the encoding, and one that doesn't. For maximal compatibility we can specify both.

    Code:

    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));
    

    Example header: inline; filename*=UTF-8''Hello%20World.doc; filename=Hello%20World.doc

    Successfully tested with

    • Firefox ✔
    • Chrome ✔
    • Edge ✔
    • Internet Explorer ✔
    0 讨论(0)
提交回复
热议问题