后台响应头: response.setHeader("content-type", "application/octet-stream"); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + filename); 然后通过流进行下载: os = response.getOutputStream(); bis = new BufferedInputStream(new FileInputStream(new File(path))); int i = bis.read(buff); while (i != -1) { os.write(buff, 0, buff.length); os.flush(); i = bis.read(buff); }
问题1.下载pptx文件,打开一直报文件模板损坏问题
原因:模板文件本身就有问题,打开另存为ppt解决。
问题2.本地开发环境下载正常,打包成jar在linux上下载失败。
原因:打成jar包后,路径不是从src开始而是直接从resource下开始。并且需要通过如下方式读取文件:
Resource res = new ClassPathResource("template/..ppt"); InputStream is = res.getInputStream(); bis = new BufferedInputStream(is);
问题3.下载excel文件,报错文件部门内容有问题需要修复。
原因:下载excel文件,response响应给前台,需要告诉前台是否已传完,设置如下响应头即可:
response.setHeader("Content-Length", String.valueOf(bis.available()));
问题4.加上content-length后,打包jar在linux服务器上,报文件已损坏
原因:打成jar包,无法一次性获取流的大小,流大小可能为0,故导致content-length为0文件损坏
解决方式:在下载前,先请求获取content-length的接口,通过: Resource res = new ClassPathResource("template/..ppt"); InputStream is = res.getInputStream(); bis = new BufferedInputStream(is); OutputStream os = new OutputStream... IOUtils.copy(bis, os); copy后就返回输入流的大小 return contentLength; 获取到content-length,然后将获取到的content-length作为参数,传递给下载的接口即可解决。
问题5:.springboot-导出项目路径中的文件,使用前台请求,后台读取文件,转换为流,供前台下载。
打包后,下载失败找不到路径,原因,打包后,不是src项目路径为:
BOOT-INF
——classes
——config
所以,下载要根据运行的环境变量来动态取路径。
参考链接:https://blog.csdn.net/liubin5620/article/details/79530490
参考链接:https://blog.csdn.net/u013945868/article/details/79581979