后端:
// 文件下载功能
@RequestMapping("/excel/download")
public void downexcel(HttpServletResponse res){
System.out.println("文件下载功能==");
String fileName = "日报表.xlsx";
res.setHeader("content-type", "application/octet-stream");
res.setContentType("application/octet-stream");
res.setHeader("Content-Disposition", "attachment;filename=" + fileName);
byte[] buff = new byte[1024];
BufferedInputStream bis = null;
OutputStream os = null;
try {
os = res.getOutputStream();
bis = new BufferedInputStream(new FileInputStream(new File("d://"+fileName)));
int i = bis.read(buff);
while (i != -1) {
os.write(buff, 0, buff.length);
os.flush();
i = bis.read(buff);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("success");
}
前端(vue):
<el-button style="width: 140px;" type="success"><a style="color: #ffffff;" class='download' :href='xxx/excel/download' download="" title="excel模板下载">excel模板下载</a></el-button>
参考实现:https://blog.csdn.net/qq_37497275/article/details/80327661
补充:有时下载出现:
原因是:在HttpServletResponse Header中没有指定指定Content-Length:完整方法:
文件在resources目录下的static的excel目录下:
代码:
// 文件下载功能 @RequestMapping("/excel/download") public void downexcel(HttpServletResponse res){ try { //获取要下载的模板名称 String fileName = "xx.xlsx"; //设置要下载的文件的名称 res.setHeader("Content-disposition", "attachment;fileName=" + fileName); //通知客服文件的MIME类型 res.setContentType("application/vnd.ms-excel;charset=UTF-8"); //获取文件的路径 //String filePath = getClass().getResource("/template/" + fileName).getPath(); //excel模板路径 File cfgFile = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "static/excel/xx.xlsx"); FileInputStream input = new FileInputStream(cfgFile); // FileInputStream input = new FileInputStream(new File("d://"+fileName)); OutputStream out = res.getOutputStream(); byte[] b = new byte[2048]; int len; while ((len = input.read(b)) != -1) { out.write(b, 0, len); } //修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?如果信任此工作簿的来源,请点击"是" res.setHeader("Content-Length", String.valueOf(input.getChannel().size())); input.close(); System.out.println("应用导入模板下载完成"); } catch (Exception ex) { System.out.println("应用导入模板下载失败!"); }
}