公司有个需求是下载excel的模板文件,我将excel文件放在了resouece资源文件夹下,通过文件流读取并写入到response流当中,调试接口文件能下载一切正常。后面打成jar包上到服务环境之后,下载的excel体积为0kb 并且打开之后显示文件是损坏的。后面通过将resouece资源文件夹下的文件先暂存到一个临时文件中,再读取临时文件的流解决了这个损坏文件的问题。
public void downLoadTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {
String fileName = "机构导入模板.xlsx";
ClassPathResource classPathResource = new ClassPathResource("/excel/机构导入模板.xlsx");
InputStream inputStream = classPathResource.getInputStream();
//生成目标文件
File somethingFile = File.createTempFile("Topic_Template", ".xlsx");
try {
FileUtils.copyInputStreamToFile(inputStream, somethingFile);
} finally {
IOUtils.closeQuietly(inputStream);
}
InputStream in = new FileInputStream(somethingFile);
FileDownLoadUtil.getFileContent(in, fileName, response, request);
}
public static void getFileContent(InputStream inputStream, String name, HttpServletResponse response, HttpServletRequest request) {
// 清空response
response.reset();
try {
InputStream in = inputStream;
response.setHeader("Content-Length", String.valueOf(in.available()));
byte[] buffer = new byte[in.available()];
//不加打开会文件损坏
in.read(buffer);
in.close();
String userAgent = request.getHeader("User-Agent");
String fileName;
if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
fileName = URLEncoder.encode(name, "UTF-8");
} else {
// 非IE浏览器的处理:
fileName = new String(name.getBytes("UTF-8"), "ISO-8859-1");
}
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}