Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等)
Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等)
准备文件,这里我放在resource下的templates路径
在pom中配置构建打包的资源,更新maven
如果使用了assembly打包插件这样配置可能仍不生效,检查并配置 package.xml文件
编写下载接口,返回要下载的模版文件,fileName可以根据需要灵活配置
@GetMapping("/download")
@ApiOperation(value = "下载导入模版", notes = "")
public void download(HttpServletResponse response) throws IOException {
String fileName = "数据项集导入模板.xlsx";
//获得待下载文件的绝对路径
String realPath = ResourceUtils.getURL("classpath:").getPath() + "templates";
//获取文件输入流
FileInputStream fileInputStream = new FileInputStream(new File(realPath, fileName));
//文件名包含中文时需要进行中文编码,否则会出现乱码问题
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
ServletOutputStream servletOutputStream = response.getOutputStream();
int len = 0;
//设置一个缓冲区,大小取决于文件内容的大小
byte[] buffer = new byte[1024];
//每次读入缓冲区的数据,直到缓冲区无数据
while ((len = fileInputStream.read(buffer)) != -1) {
//输出缓冲区的数据
servletOutputStream.write(buffer, 0, len);
}
servletOutputStream.close();
fileInputStream.close();
}
这样做完后,使用swagger测试接口大概率会出现"%A8%A1%E6%9D%BF.xlsx"这种格式,这是由于Swagger对文件名进行了URL编码,导致文件名在下载时显示为编码后的形式。
直接使用浏览器进行Get测试接口,文件编码正常,完美!