excel下载模板,0KB或者乱码问题
Sptingboot项目
— maven打包,云效,docker,k8s
场景
— 导出excel模板
问题
1.乱码

2.下载为0KB,打开没有数据

模板内容

测试代码
测试方法
| 方法 | 过程 | 结果 | 问题原因 |
|---|---|---|---|
| 将文件直接放到服务器 | 使用接口下载 | 数据正常,排除文件问题 | 排除接口问题,文件问题 |
| 文件放到resource目录下 | 使用接口下载 | 下载乱码 | 使用相同接口下载乱码,猜测是maven编译问题 |
| 文件移出到resouce目录外 | 使用接口下载 | 下载为0KB | 使用相同接口下载乱码,猜测是maven编译问题 |
代码
InputStream inputStream = null;ServletOutputStream servletOutputStream = null;try {//注意修改目录Resource resource = new DefaultResourceLoader().getResource("classpath:file/goods_import.xls");response.setContentType("application/force-download");response.setHeader("Content-Disposition", "attachment;fileName=" + new String("goods_import".getBytes(), StandardCharsets.ISO_8859_1)+ ".xls");inputStream = resource.getInputStream();servletOutputStream = response.getOutputStream();IOUtils.copy(inputStream, servletOutputStream);response.flushBuffer();} catch (Exception e) {log.error("下载批量上传用户模板文件错误", e);} finally {try {if (servletOutputStream != null) {servletOutputStream.close();}if (inputStream != null) {inputStream.close();}} catch (Exception e) {log.error("下载批量上传用户模板文件错误", e);}}
过程-可以跳过直接看解决办法
— 遵循网上的办法,使用字节流,设置字节大小,设置编码,都测试过一遍。
设置字节大小
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("classpath:file/goods_import.xls");File file = new File("goods_import.xls"); // 指定下载文件的路径和名称try (OutputStream outputStream = new FileOutputStream(file)) {// 将inputStream中的数据写入到outputStream中,确保文件不为0KBbyte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}} catch (IOException e) {e.printStackTrace(); // 处理异常}finally {if (file.exists()){file.delete();}}
设置字符集编码
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setHeader("Content-Disposition", "attachment; filename=\"" + "file/goods_import.xls" + "\"");//这里设置为GBK,UTF-8都不行response.setCharacterEncoding("GBK");try (BufferedInputStream inputStream = new BufferedInputStream(ImportBusiness.class.getClassLoader().getResourceAsStream("file/goods_import.xls"));OutputStream outputStream = response.getOutputStream()) {if (inputStream == null) {// 处理文件未找到的情况response.sendError(HttpServletResponse.SC_NOT_FOUND, "File not found");return;}byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}outputStream.flush();} catch (IOException e) {// 处理IO异常response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "IO error");}
使用字节流输出
/*** 模板下载*/public void downloadTemplate(HttpServletResponse response) {OutputStream out = null;InputStream in = null;ByteArrayOutputStream bos = null;String fileName = "good_import";try {// 读取模板Resource res = new ClassPathResource("classpath:file/goods_import.xls");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") + ".xls");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);}}if (null != out) {try {out.close();} catch (IOException e) {log.error("关闭资源异常", e);}}if (null != bos) {try {bos.flush();bos.close();} catch (IOException e) {log.error("关闭资源异常", e);}}}}
经测试以上方法均不行,然后考虑到jar打包会被编译,会不会是这个导致的呢。能不能忽略掉这个xls文件呢?
这里使用maven打包,使用提供的插件排除,如下
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>3.2.0</version><configuration><nonFilteredFileExtensions><nonFilteredFileExtension>xlsx</nonFilteredFileExtension><nonFilteredFileExtension>xls</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin>

重新调用接口下载,文件正常
相关文章:
excel下载模板,0KB或者乱码问题
Sptingboot项目 — maven打包,云效,docker,k8s 场景 — 导出excel模板 问题 1.乱码 2.下载为0KB,打开没有数据 模板内容 测试代码 测试方法 方法过程结果问题原因将文件直接放到服务器使用接口下载数据正常,排除文件问题排…...
JDBC连接Mysql数据库超详细讲解
JDBC连接Mysql数据库 如何导入驱动jar包 进入mysql官网 – https://www.mysql.com/ 点击下载找到方框内选项 点击 在项目文件夹创建lib文件 , 将下载好的驱动器导入 , 再添加到项目即可 步骤一:注册JDBC驱动 在Java中,要与数据库进行交互&…...
ArcGIS基础:自定义创建点线面等样式符号以方便使用
有时,使用ArcGIS自带的符号样式库无法满足我们使用要求,还需要进行调整,可能会浪费一些时间,那么自己新建一些样式符号备用, 需要的时候直接使用,会节省很多时间,大家学会之后,对学…...
蔚来2025届全球校招笔试/测评通关攻略北森测评题库更新了!
蔚来2025届全球校园招聘笔试/测评攻略 尊敬的各位考生,蔚来汽车2025届全球校园招聘笔试/测评环节即将开启。为了帮助您更好地准备并顺利通过这一环节,我们特此提供以下详细攻略。 一、考前准备 确认考试时间:请务必在截止日期前完成考试&am…...
如何在linux系统上部署Redis
<1>简介 Redis 全称 Remote Dictionary Server(远程字典服务器),是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务…...
操作系统开发行业的市场需求分析
操作系统作为计算机软件生态的核心,其开发不仅关乎技术的深度与广度,更与市场需求紧密相连。随着技术的不断进步和各行各业对数字化转型的迫切需求,操作系统开发行业面临着日益复杂且多样化的市场需求。以下从基础功能需求、技术创新需求、行…...
SpringMVC 的 拦截器
Spring MVC 提供了一套拦截器(Interceptor)机制,主要用于处理 Web 请求到达控制器之前或响应离开控制器之后执行一些操作。拦截器可以用于执行预处理(如验证用户身份)和后处理(如清理资源或修改响应&#x…...
Redisson可重入锁原理(基于黑马视频总结,保姆级)
上一篇文章我们基于redis的set nx ex 命令以及Lua脚本实现了基本的分布式锁,但是还存在一下几点问题。于是又引出了redisson。 为什么基于SETNX的分布式锁无法实现可重入 先在method1中获取锁,获取成功后又调用method2,而method2内部也会获取…...
Ubuntu 安装 Watt-Toolkit
一、下载 Watt-Toolkit 下载Watt-Toolkithttps://steampp.net/download 二、设置 Watt-Toolkit 打开 Watt-Toolkit,点击 “网络加速→加速设置,打开证书文件夹” ,当前证书路径为:/home/yammie/.local/share/Steam/Plugins/Acc…...
python中的省略号(...)
下面对python学习中遇到的省略号做个总结 # 1. 前言 在Python中,一切皆对象,...也是对象,它和对象Ellipsis是等价的。对象...和Ellipsis的类型都是ellipsis,代码示例如下。 print(Ellipsis) # 输出:Ellipsis print(…...
第129天:内网安全-横向移动WmiSmbCrackMapExecProxyChainsImpacket
这里这个环境继续上一篇文章搭建的环境 案例一: 域横向移动-WMI-自带&命令&套件&插件 首先上线win2008 首先提权到system权限 wmic是windows自带的命令,可以通过135端口进行连接利用,只支持明文方式,优点是不用上传别…...
ChatGPT教我将MySQL中where find_in_set改成PostgreSQL支持的写法
问题 之前使用Mybatis,在MySQL中使用如下SQL语句没有问题: SELECT * FROM dept WHERE find_in_set(5,dept_parent);现在切换到PostgreSQL,发现find_in_set函数不能使用。 解决 SELECT * FROM dept WHERE 5 ANY(string_to_array(dept_parent, ,));总…...
Python命令模式:掌控你的代码指令
Python命令模式:掌控你的代码指令 在软件工程的浩瀚海洋中,命令模式(Command Pattern)是一盏指引航向的明灯,它将请求或操作封装成对象,从而让代码更加灵活、可扩展。本文将深入探讨Python中的命令模式&am…...
【物联网】(防水篇)电子产品 IPX7 防水级别测试的具体流程
电子产品 IPX7 防水级别测试的具体流程 1. 准备工作: - 准备一个足够大的浸水箱,确保水深至少为 1 米,以满足 IPX7 测试的标准要求。 - 将水温控制在标准温度范围内,通常在 15-35 摄氏度之间,以模拟正常使用环境。 2…...
Redis 实现消息队列
Redis 实现消息队列 文章目录 Redis 实现消息队列导引1. 基于List结构的消息队列2. 基于PubSub的消息队列3. 基于Stream的消息队列(推荐)3.1 XADD3.2 XREAD3.3 XGROUP 导引 消息队列(Message Queue),从概念上来理解就是用来存放消息的队列,最简单的消息…...
模板初阶(详解)
一、泛型编程 为了引出模板,我们来看下面代码,比如要实现不同类型的交换函数,如下: void Swap(int& a, int& b) {int c a;a b;b c; } void Swap(char& a, char& b) {char c a;a b;b c; } void Swap(doubl…...
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
📚 对称加密算法解析:DES、AES及其在pycryptodome 和 crypto-js 模块中的应用 🗝️ DES 算法 算法原理 数据加密标准(DES)是一种对称密钥加密算法,用于保护数据的安全。DES 使用一个 56 位的密钥进行加密…...
C++设计模式(代理模式)
1. 电话虫 在海贼中,有一种神奇的通信工具叫做电话虫(Den Den Mushi),外形如蜗牛,身上带有斑点或条纹或通体纯色,壳顶上有对讲机或按键,不接通时会睡觉,接通时会惊醒,并发…...
Linux系统驱动(十三)Linux内核定时器
文章目录 一、内核定时器原理二、定时器API三、使用定时器让LED灯闪烁四、使用定时器对按键进行消抖 一、内核定时器原理 内核当前时间通过jiffies获取,它是内核时钟节拍数,在linux内核启动的时候,jiffies开始(按照一定频率&…...
Visual Studio 调试时加载符号慢
什么是调试符号 编译程序时生成的一组特殊字符,并包含有关变量和函数在生成的二进制文件中的位置以及其他服务信息的信息。 该数据集可用于逐步调试程序或检查第三方代码。 调试符号可以添加到可执行文件或库中,但是大多数现代编译器将它们存储为单独的…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
