备注:controller层一定要用post!!!!!!post!!!!post!!!!因为我喜欢post
打开文件情况下会在res下生成$开头的同名文件
备注:以~$开头的文档是word的自我保护程序,其目的是为了防止正在编辑的文档信息因为意外情况关闭而丢失。(这是我在备注之后,研究了研究加的。get好像也没事)
用的时候,filename改为自己res下tamplet下的文件名.xlsx就行了,其他都不用动。、
现在我直接C了代码,改文件名,全部测试成功
/**
* * 基于res下xlsx读取文件并传输给前端
* @param response
*/
@Override
public void eventUploadTemplateQuickTrackingAtResources(HttpServletResponse response) {
String fileName = "EventUploadTemplate_QuickTracking.xlsx";
//读取文件
try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("template/" + fileName);
ServletOutputStream servletOutputStream = response.getOutputStream()) {
if (inputStream == null) {
throw new BusinessException("模板文件不存在");
}
//设置响应
EasyExelUtil.setResponse(response, fileName);
IOUtils.copy(inputStream, servletOutputStream);
response.flushBuffer();
} catch (IOException e) {
log.error("下载模板文件错误", e);
throw new BusinessException("下载模板文件错误");
}
}
}
public static HttpServletResponse setResponse(HttpServletResponse response, String fileName) {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");
try {
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
} catch (UnsupportedEncodingException e) {
log.error("编码设置异常");
throw new BusinessException("编码设置异常");
}
return response;
}
//参考
//备注:如使用此版本,文件名字及相关resp参数(可能会有问题,显示为resp)需要改为我上面代码
@Slf4j
@RestController
public class TestController {
@Autowired
private ResourceLoader resourceLoader;
/**
* 实现方式1
* @param response
* @param request
*/
@ApiOperation("下载模板")
@GetMapping("/downloadTemplate")
public void downloadTemplate(HttpServletResponse response, HttpServletRequest request) {
InputStream inputStream = null;
ServletOutputStream servletOutputStream = null;
try {
String filename = "excel导入模板.xlsx";
String path = "template/test.xlsx";
Resource resource = resourceLoader.getResource("classpath:"+path);
response.setContentType("application/vnd.ms-excel");
response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.addHeader("charset", "utf-8");
response.addHeader("Pragma", "no-cache");
String encodeName = URLEncoder.encode(filename, StandardCharsets.UTF_8.toString());
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodeName + "\"; filename*=utf-8''" + encodeName);
inputStream = resource.getInputStream();
servletOutputStream = response.getOutputStream();
IOUtils.copy(inputStream, servletOutputStream);
response.flushBuffer();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (servletOutputStream != null) {
servletOutputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 实现方式2
* @param response
* @param request
* @throws IOException
*/
@ApiOperation("下载模板")
@GetMapping("/downloadTemplate1")
public void downloadTemplate1(HttpServletResponse response, HttpServletRequest request) throws IOException {
ClassPathResource classPathResource = new ClassPathResource("template/test.xlsx");
InputStream inputStream = classPathResource.getInputStream();
ServletOutputStream servletOutputStream = null;
try {
String filename = "excel导入模板.xlsx";
response.setContentType("application/vnd.ms-excel");
response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.addHeader("charset", "utf-8");
response.addHeader("Pragma", "no-cache");
response.setHeader("Content-Disposition", "attachment;fileName=" + new String(filename.getBytes(), StandardCharsets.ISO_8859_1) + ".xlsx");
servletOutputStream = response.getOutputStream();
IOUtils.copy(inputStream, servletOutputStream);
response.flushBuffer();
} catch (Exception e) {
log.error("下载模板文件错误",e);
e.printStackTrace();
} finally {
try {
if (servletOutputStream != null) {
servletOutputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}