关于Java文件下载时文件名乱码问题,可以使用以下方案解决:
方案一:使用Content-Disposition和URLEncoder
在Java中,可以使用Content-Disposition响应头设置文件下载时的文件名,再使用URLEncoder对文件名进行编码,如下:
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
其中,fileName为文件原始名称,在服务器端需要先转换为UTF-8编码。
示例代码:
@RequestMapping("/download")
public ResponseEntity<byte[]> downloadFile() throws Exception {
// 模拟文件下载,获取文件流和文件名
InputStream is = new FileInputStream(new File("D:/temp/测试文件.xlsx"));
String fileName = "测试文件.xlsx";
// 设置响应头
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 设置响应内容
byte[] bytes = new byte[is.available()];
is.read(bytes);
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(bytes, headers, statusCode);
return response;
}
方案二:使用HttpResponseHeader
在Webservice调用java端方法时
- 需使用文件名称,而不是流名称传递;
- 规范化的在文件名称中尽量不要包含特殊字符,如”+”,“=”等;
- 在传递文件名称时,使用HTTP响应头进行实现;
具体实现代码:
public void downLoadFile(@WebParam(name = "fileName")
String fileName, @WebParam(name = "filePath")
String filePath, @WebParam(name = "response")
HttpServletResponse response) throws Exception {
File file = new File(filePath);
InputStream in = null;
OutputStream out = null;
try {
in = new BufferedInputStream(new FileInputStream(file));
out = response.getOutputStream();
response.setHeader("Content-Disposition", "attachment;filename=" +
new String(fileName.getBytes("GB2312"), "ISO-8859-1"));
response.setContentType("application/octet-stream");
byte[] buffer = new byte[1024];
int readLength = in.read(buffer);
while (readLength != -1) {
out.write(buffer, 0, readLength);
readLength = in.read(buffer);
}
} catch (IOException ex) {
LOGGER.error("下载文件异常:{}", ex.getMessage(), ex);
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.flush();
out.close();
}
}
}
以上这两种方法都可以有效解决Java文件下载时文件名乱码的问题。其中,方案二还适用于Webservice调用Java端方法时下载文件时文件名乱码问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解关于java文件下载文件名乱码问题解决方案 - Python技术站