java——前台通过接口下载项目中的文件

时间:2024-02-18 22:37:48

 

后台响应头:
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