SpringBoot打成jar包部署,Excel模板下载文件损坏,提示恢复踩过的坑

小编 2026-06-11 阅读:615 评论:0
Spring Boot 静态资源Excel模板文件下载遇到的坑 问题描述: 使用spring boot,在resource/static目录下,有Excel模板文件, 需要提供给用户下载,用于数据的导入...

Spring Boot 静态资源Excel模板文件下载遇到的坑

问题描述:

使用spring boot,在resource/static目录下,有Excel模板文件, 需要提供给用户下载,用于数据的导入;

在eclipse中启动应用服务,使用文件输出流下载文件,文件下载成功,打开的时候提示文件内容有问题,打开失败;

即使是使用springboot封装的,直接使用静态资源下载的方式,也还是会出现一样的问题;

好不容易处理上述问题之后,项目打成jar包,部署之后,还是使用文件输出流的方式下载文件,又出现一样的问题;

 

问题截图:

\"\"

发现XXXXX中的部分内容有问题,是否让我们尽量尝试恢复?如果您信任此工作簿的源,请单击”是“;

问题原因分析:

一开始度娘查到各种各样的说法,比如修改response请求回应头,比如使用ByteArrayHttpMessageConverter,比如修改文件读取方式,没点屁用!!

后面看到另外一篇文章,maven 打包的时候,使用了filter,其原理是处理文本文件,并将其替换变量,对于二进制文件有问题,参考 https://www.jianshu.com/p/9d39745f6ce6

对于这种说法,我实际的操作过程中,jar包里面的Excel文件是正常的,所以理论上不是这个问题,但是!!!这样写了之后,静态资源资源下载方式OK了,eclipse运行的服务,使用文件输出流方式也OK了!!!

当然,坑仅仅到这里的就结束的话,那就不叫坑了。我以为问题解决了,然后把应用打成jar包部署,再测试一下, 尼玛!!!这个坑又TM出现了!!!再eclipse下验证一遍,还是TM正常的,重新打包之后,坑,还在那里,一动不动、、、、

遇到这种坑,真的是给跪了,幸好我还有一个备用方案,所以,请恕我才疏学浅,也请恕我时间有限,根本问题原因我就不去定位分析了。

 

最终解决方案:

方案一:使用spring boot 静态资源下载的方式;这种方式下不需定义接口,权限等问题不可控;

        将资源文件放到resource/static目录下,启动服务,使用 IP:端口/文件路径 下载即可;这种方案下,需要将pom文件下的resource.filtering要设置为false,打成jar之后,也是正常可用的;

	<build>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<includes>
					<include>**/*.*</include>
				</includes>
				<filtering>false</filtering>	
			</resource>
			<resource>
				<directory>src/main/webapp</directory>
				<includes>
					<include>**/**</include>
				</includes>
			</resource>
			
		</resources>
	</build>

方案二:定义接口,使用getClass().getResourceAsStream方式读取资源,文件输出流方式下载;

	@GetMapping(\"/templateDownload\")
	public Object templateDownload(HttpServletResponse response) {
		try {
			// 以流的形式下载文件   这种方法,打成jar包之后,下载的文件,会被损坏
			InputStream fis = FileUtil.getResourcesFileInputStream(\"temp/template.xlsx\");
			byte[] buffer = new byte[fis.available()];
			fis.read(buffer);
			fis.close();
			response.setHeader(\"Content-Disposition\", \"attachment;filename=template.xlsx\");
			//response.setContentType(\"application/zip\");
			response.setContentType(\"application/binary;charset=ISO8859-1\");
			ServletOutputStream out = response.getOutputStream();
			out.write(buffer);
			out.flush();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

 

public class FileUtil {

    public static InputStream getResourcesFileInputStream(String fileName) {
        return Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
    }
}

       这种方法应该大部分人的问题能解决掉了,少部分人的还是解决不了,那估计就是环境的问题;我就是在这遇到这个坑,使用这种方法,eclipse下正常,打成jar包之后,又TM文件损坏,

        打成的jar包里面的资源文件拷贝出来,打开是正常的,说明文件打包是正常的,问题出在读取文件,或者输出流写出文件那块,试了N多种写法,改了N多配置,还是没有解决;还好,之前做数据导入导出的时候,有过类似的经验,于是想到了方案三;

方案三:定义接口,使用文件输出流的方式下载,接口实现过程,使用POI的Workbook输出流;

        毕竟POI是专业的,对于Excel文件处理有从根本上的理解;Excel模板文件根据.xls跟.xlsx类型,分别指定一下,使用XSSFWorkbook跟HSSFWorkbook即可,这里以XSSFWorkbook为例,其中资源文件放到resource目录下即可,非必须static目录:

	public void templateDownload(HttpServletResponse response) {
		try {
			InputStream fis = FileUtil.getResourcesFileInputStream(\"static/temp/template.xlsx\");
			XSSFWorkbook workbook = new XSSFWorkbook(fis);
			response.setContentType(\"application/binary;charset=ISO8859-1\");
			String fileName = java.net.URLEncoder.encode(\"template\", \"UTF-8\");
			response.setHeader(\"Content-disposition\", \"attachment; filename=\" + fileName + \".xlsx\");
			ServletOutputStream out = null;
			out = response.getOutputStream();
			workbook.write(out);
			out.flush();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//关闭文件输出流
		}
		return;
	}

 

 

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
标签列表