javaweb 文件下载 附件名乱码 波浪线(~)显示为(_)

问题描述:chrome浏览器下载附件 附件名字中的字符(~)乱码
IE和火狐附件名正常,chrome版本:版本 91.0.4472.124(正式版本) (64 位)

@Controller
public class FileDown {

@RequestMapping("/down")
public void  downLoad(HttpServletRequest request, HttpServletResponse response) throws IOException {
    String str = "C:\\Users\\34888\\Desktop\\新建文件夹\\1  -= 副本(3).txt";
    File file = new File (str);
    FileInputStream fileInputStream = new FileInputStream (file);
    ServletOutputStream outputStream = response.getOutputStream ();

    String encode = URLEncoder.encode ("锚123-~~~.txt", "UTF-8");
    response.setHeader ("Content-Disposition","attachement; filename="+ encode);

    int read = fileInputStream.read ();
    while(read>-1) {
        outputStream.write (read);
        read = fileInputStream.read ();
    }
}

}

实际下载:

img

img

这个是chrome的设计行为,并不是bug。是chrome的开发组主动这样实现的。
尽量避免在文件名里使用~吧。

这里有解释:
https://superuser.com/questions/1360571/character-will-be-automatically-changed-to-in-filename-during-downloadin
https://bugs.chromium.org/p/chromium/issues/detail?id=479419

img

这个可能并不是乱码,而且编辑器并不识别~,会自动把~看作为_来处理。你换成其他特殊字符应该可以。

IO流没关闭

是文件名乱码,还是文件内容乱码

 @RequestMapping("/down")
    public void downLoad(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String str = "C:\\Users\\34888\\Desktop\\新建文件夹\\1  -= 副本(3).txt";
        File file = new File(str);
        FileInputStream fileInputStream = new FileInputStream(file);
        ServletOutputStream outputStream = response.getOutputStream();

        String encode = URLEncoder.encode("锚123-~~~.txt", "UTF-8");
        response.setHeader("Content-Disposition", "attachement; filename=" + encode);
        response.setHeader("content-type", getServletContext().getMimeType("锚123-~~~.txt"));

        int read = fileInputStream.read();
        while (read > -1) {
            outputStream.write(read);
            read = fileInputStream.read();
        }
        fileInputStream.close();
        outputStream.close();
    }

试一下

 @RequestMapping("/down")
    public void downLoad(HttpServletRequest request, HttpServletResponse response) throws IOException {
        File file = new File("C:\\Users\\34888\\Desktop\\新建文件夹\\1  -= 副本(3).txt");
       
        //设置输入, 输入流
        FileInputStream fileInputStream = new FileInputStream(file);
        ServletOutputStream outputStream = response.getOutputStream();

        //转换中文编码
        String encode = URLEncoder.encode("锚123-~~~.txt", "UTF-8");

        //设置响应头
        response.setHeader("Content-Disposition", "attachement; filename=" + encode);
        response.setHeader("content-type", getServletContext().getMimeType("锚123-~~~.txt"));
        
        //写出流
        byte[] bytes = new byte[1024];
        while (fileInputStream.read(bytes) != -1) {
            outputStream.write(bytes, 0, bytes.length);
            outputStream.flush();
        }
        fileInputStream.close();
        outputStream.close();
    }

@Silence丶你的名字 试过了还是不行,截图已经私信你了,麻烦大佬再帮忙看下,谢谢!