IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Excel模板文件放在项目中部署,下载出来是空文件,没有模板内容 -> 正文阅读

[开发测试]Excel模板文件放在项目中部署,下载出来是空文件,没有模板内容

前段时间做项目时,有个需要下载excel模板的需求,但是由于用的是K8S部署,不能直接把模板文件放到指定的服务器,于是就把模板文件放到了项目resources目录下,然后本地测试一切正常,顺利提到了测试。

结果测试环境除了问题,下载下来是个空的excel,返回的response数据也是空。于是开始找问题,本地postman测试,response返回是乱码(其实文件是正常的,应该该是编码问题),文件下载出来没问题。postman连接测试接口,response是空,下载的文件还是空excel。然后网上各种找解决方案,发现百度出来的帖子,基本上千篇一律,就是一个帖子被N多人CV的,连格式都一模一样,找小伙伴帮忙看,也没有找到解决方案,问题就这么搁置了两天,一直没解决。

后来偶尔看到一个帖子,用了不一样的方法读取,我就试了一下,问题就解决了。直接贴代码,注意resource别导错包。

import org.springframework.core.io.Resource;
 ?
/**
?? ? * 模板下载
?? ? */
?? ?public void downloadTemplate(HttpServletResponse response){
?? ??? ?OutputStream out = null;
?? ??? ?InputStream in = null;
?? ??? ?ByteArrayOutputStream bos = null;
?? ??? ?String fileName = "导入模版";

?? ??? ?try {
?? ??? ??? ?// 读取模板
?? ??? ??? ?Resource res = new ClassPathResource("Template.xlsx");
?? ??? ??? ?XSSFWorkbook workbook = new XSSFWorkbook(res.getInputStream());

?? ??? ??? ?// 转换为字节流
?? ??? ??? ?bos = new ByteArrayOutputStream();
?? ??? ??? ?workbook.write(bos);
?? ??? ??? ?byte[] barray = bos.toByteArray();
?? ??? ??? ?in = new ByteArrayInputStream(barray);

?? ??? ??? ?response.reset();
?? ??? ??? ?response.setContentType("application/octet-stream");
?? ??? ??? ?response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
?? ??? ??? ?out = response.getOutputStream();
?? ??? ??? ?byte[] b = new byte[1024];
?? ??? ??? ?int len;
?? ??? ??? ?while ((len = in.read(b)) > 0) {
?? ??? ??? ??? ?out.write(b, 0, len);
?? ??? ??? ?}
?? ??? ??? ?out.flush();
?? ??? ?} catch (Exception e) {
?? ??? ??? ?log.error("下载模板失败",e);
?? ??? ?} finally {
?? ??? ??? ?if (null != in) {
?? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ?in.close();
?? ??? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ??? ?log.error("关闭资源异常",e);
?? ??? ??? ??? ?}
?? ??? ??? ??? ?in = null;
?? ??? ??? ?}
?? ??? ??? ?if (null != out) {
?? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ?out.close();
?? ??? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ??? ?log.error("关闭资源异常",e);
?? ??? ??? ??? ?}
?? ??? ??? ??? ?out = null;
?? ??? ??? ?}
?? ??? ??? ?if (null != bos) {
?? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ?bos.flush();
?? ??? ??? ??? ??? ?bos.close();
?? ??? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ??? ?log.error("关闭资源异常",e);
?? ??? ??? ??? ?}
?? ??? ??? ??? ?out = null;
?? ??? ??? ?}
?? ??? ?}
?? ?}

困扰我两天的问题,Resource res = new ClassPathResource("whiteListTemplate.xlsx"); 这一行代码就解决了。

总结:本地测试时,可以直接读取到项目中的文件,所以能把文件下载下来。但是线上部署用的Docker和K8S,是jar包运行的,在读取文件的时候,因为之前的方法问题,一直读取不到文件内容,然后用Resource res = new ClassPathResource("Template.xlsx"); 是通过流的形式读取的,resource继承了InputStreamSource,所以才能以流的方式读取到文件内容。

因为对K8S、Docker和Spring源码并不了解,以上只是我个人的猜想,希望知道原理或者正确答案的小伙伴不吝赐教,万分感谢!

?

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 16:17:31  更:2021-12-18 16:17:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 6:42:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码