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 调试时加载符号慢
什么是调试符号 编译程序时生成的一组特殊字符,并包含有关变量和函数在生成的二进制文件中的位置以及其他服务信息的信息。 该数据集可用于逐步调试程序或检查第三方代码。 调试符号可以添加到可执行文件或库中,但是大多数现代编译器将它们存储为单独的…...
Realtek 8922AE WiFi 7网卡驱动固件版本不匹配实战指南:从问题诊断到长效维护
Realtek 8922AE WiFi 7网卡驱动固件版本不匹配实战指南:从问题诊断到长效维护 【免费下载链接】rtw89 Driver for Realtek 8852AE, an 802.11ax device 项目地址: https://gitcode.com/gh_mirrors/rt/rtw89 在Linux系统中,网卡驱动是连接网络的核…...
LabView实战:高效实现float到十六进制的精准转换VI设计
1. 为什么需要float到十六进制的精准转换? 在工业自动化和测试测量领域,我们经常需要处理各种传感器采集的浮点数据。比如温度传感器返回的25.6℃、压力传感器检测的101.325kPa,这些数据在LabView中通常以float类型存储。但在某些特殊场景下&…...
三星固件管理工具Bifrost:跨平台固件获取与处理的技术伙伴
三星固件管理工具Bifrost:跨平台固件获取与处理的技术伙伴 【免费下载链接】SamloaderKotlin 项目地址: https://gitcode.com/gh_mirrors/sa/SamloaderKotlin 在三星设备维护与开发工作中,获取和处理官方固件往往是一项复杂且耗时的任务。传统方…...
5种手柄映射方案让手游玩家实现主机级操控体验
5种手柄映射方案让手游玩家实现主机级操控体验 【免费下载链接】escrcpy 📱 Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 手机游戏操控优化一直是困扰玩家的核心痛点&…...
重磅!GPT-6曝光了
就在刚刚,有知情人士爆料:GPT-6正在内测,预计4月16日正式发布。消息源头,是X平台上的科技大V 草莓哥iruletheworldmo。他说,最近OpenAI内部将有大动作,他从中搞到了不少猛料。草莓哥说了一些关键信息&#…...
金融数据接口实战指南:从基础认知到生态拓展
金融数据接口实战指南:从基础认知到生态拓展 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcode.com/gh_mirrors/aks/akshare …...
Real-Time-Person-Removal 终极性能优化指南:10个技巧让实时处理速度翻倍
Real-Time-Person-Removal 终极性能优化指南:10个技巧让实时处理速度翻倍 【免费下载链接】Real-Time-Person-Removal Removing people from complex backgrounds in real time using TensorFlow.js in the web browser 项目地址: https://gitcode.com/gh_mirrors…...
学习笔记-http协议
1.http介绍http(超文本运输协议)是一种应用层协议,他定义了web客户机是如何向web服务器请求web页面,以及服务器如何将web页面传送给客户机的。他是基于 TCP(HTTP/3 基于 UDP)的结构化请求 - 响应协议&#…...
【案例共创】码道小工匠,儿童跳绳智能计数系统开发实战
最新案例动态,请查阅【案例共创】码道小工匠,儿童跳绳智能计数系统开发实战小伙伴们快来进行实操吧! 本案例由开发者:yd_sun提供,华为开发者空间案例中心优化并收录。 一、概述 1.1 适用对象 个人开发者高校学生企…...
NLP-StructBERT赋能内容去重:展示海量文本相似度排查惊艳效果
NLP-StructBERT赋能内容去重:展示海量文本相似度排查惊艳效果 每次打开内容平台,你是不是也经常看到一堆“换汤不换药”的文章?标题不一样,内容却大同小异。对于平台运营者来说,这更是个头疼的问题:怎么从…...
