前言
导出功能的实现,主要记录总结导出过程中出现的一些问题。
代码实现导出功能
public R templateDown(HttpServletResponse response) {String fileName = "template.xlsx";// 清空responseresponse.reset();response.setCharacterEncoding("UTF-8");response.setContentType("application/x-msdownload");try {//解决乱码String exportName = "导入模板.xlsx";String fileNameCode = URLEncoder.encode(exportName,"UTF-8");response.setHeader("Content-Disposition", "attachment;fileName=" + fileNameCode);//获取文件路径String fileUrl = emergencyPath;//获取项目在服务器上的真实路径fileUrl = fileUrl + File.separator + fileName;File file = new File(fileUrl);if (!file.exists()) {
// response.sendError(500, "File not found!");return R.fail("模板文件不存在");}long fileLength = file.length();response.setHeader("Content-Length", String.valueOf(fileLength));BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());byte[] buff = new byte[2048];int bytesRead;while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {bos.write(buff, 0, bytesRead);}bis.close();bos.close();} catch (Exception e) {e.printStackTrace();}return R.success("导出成功");}
问题总结
- 导出文件名、文件内容乱码问题,以下几种情况可尝试解决该问题
- 设置参数前response清空,有些情况可通过reset()解决。
// 清空response
response.reset();
- 对导出的文件名编码处理:
String fileNameCode = URLEncoder.encode(exportName,"UTF-8");
response.setHeader("Content-Disposition", "attachment;fileName=" + fileNameCode);
- 也是一种编码处理,和第二种方式差不多,都是对文件头设置:
fileName = URLEncoder.encode(fileName,"utf-8");
response.addHeader("Content-Disposition","attachment;filename=" + new String(fileName.getBytes("utf-8"),"ISO8859-1"));
- 文件路径、文件名都是对的,但是通过new File(path)一直返回找不到文件。
原因:服务器的文件名是不是中文名,如果是中文名可能会出现即使路径都写对了,仍出现文件找不到的问题。强烈建议服务器上文件名用英文!!!