线上问题 xls/xlsx 问题分析
背景:业务人员根据页面模板下载的文件上传数据(下载模板是 .xls 文件)。页面提示:文件格式错误,请根据下载模板文件上传
具体分析:
- 首先想到看日志,具体报什么错?由于系统对敏感操作有记录表,所以先去日志表查看,如果得不到有用的信息再去服务器日志文件看
- 数据库表记录了报错原由:The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
- 拿到一看就是实际上传了 .xlsx 格式的文件,但是代码使用 HSSFXXXXX 去做了解析文件。
- 回到业务人员问题:我下载模板是 .xls。为什么会提示要我使用 XSSF 相关代码解析
- 分两部分分析原因
-
- 模板下载:发现文件服务器上此文件是 .xlsx 格式,但是写回前端的时候,前端重命名了,改为 .xls(这样其实下载打开的时候会提示文件错误,但能正常使用)
- 上传:代码对 .xls / .xlsx 分别做了不同的处理。
所有实际文件格式是 .xlsx ,但是被重命名了 .xls「实际格式还是 .xlsx」。上传到后台会按照 .xls 代码处理,所以报错。
总结:
- 功能实现:文件模板下载,应该直接 nginx 跳转下载,而不是后端写流,前端接口再过一遍。这样就可以杜绝,文件后缀不一致问题
- 支持 .xls / .xlsx 这个功能是最近才上的。所以还是开发和测试没有测到位。应当更加「敬畏生产环境」
- 在直接使用原生的 poi 操作的时候,注意 xls 对应的代码:HSSF;xlsx 对应的代码是 XSSF「两者严格对应,不能互换」;SXSSF 是对应大数据量操作使用的类
很多时候并不是这个问题很难,或者这个 bug 的边界很偏。仅仅是开发人员和测试人员的麻痹大意。
敬畏生产,从你我做起!