问题描述: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 ();
}
}
}
实际下载:
这个是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
这个可能并不是乱码,而且编辑器并不识别~,会自动把~看作为_来处理。你换成其他特殊字符应该可以。
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丶你的名字 试过了还是不行,截图已经私信你了,麻烦大佬再帮忙看下,谢谢!