排查步骤
- 模板源文件是否可以正常打开
- 编译后,在target中的模板文件是否可以打开
- 模板填充后,下载的文件是否可以打开
分情况解决
1. 源模板文件打不开
这不用说了,模板本身有问题。可能你的模板是从其他地方copy来的,中间做了什么额外处理,等放到项目中时已经损坏了。
2. 编译后,target目录中,该模板文件打不开
示例
比如:下面这个编译后的excel,双击看是否能打开,能打开的话再看下内容是不是空的
如果打不开,或者内容是空的,说明是代码编译时产生了问题。
问题
我这边的问题是<filtering>true</filtering>
<filtering>true</filtering>
的作用:在Maven构建工具中,指示Maven在处理资源文件时启用过滤机制。这意味着在构建过程中,Maven会扫描指定目录下的资源文件(如配置文件、模板文件等),查找并替换其中的占位符(通常是以${...}
形式出现的变量,例如${project.version}
或自定义的变量如${app.name}
)。
这里问题的根源在于,没有排除掉template目录,因为template目录下放置的都是模板文件,而模板文件一般都有占位符。所以编译时,也被一并替换了,导致生成的target是有问题的。
解决方案
知道原因,就好解决了,只要将我们不想过滤的目录排除在外就行了
这里之所以要把<directory>src/main/resources</directory>
写两遍,是因为,只用下面的话,生成的target内容会变少,只有application*.properties
和application*.yml
。
3. 模板填充后,下载的文件打不开
如果前两项都保证正常了,到了这一步步正常,一般是文件流写出时被改动了。定位问题步骤:
- 将文件流直接写到本地,或者直接写到项目路径下,看是否能打开
这一步是确定,代码本身和写流的代码有没有什么问题。 - 写出流到web端,分别通过浏览器和调试工具(比如postman, apipost, apifox等)调用,看下载的文件是否能正常打开。
- 后端注意事项:
- 请求头设置
比如:Content-Disposition: attachment; filename*=utf-8''+"filename.jpg"
- contentType设置
比如:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
- 设置编码characterEncoding
- 请求头设置
- 前端注意事项:
比如:responseType: ‘blob’ 设置
- 后端注意事项: