网站建设服务后所有权归谁,wordpress wpgo,最新军事动态最新消息,网站如何做百度权重解决ImageIO无法读取部分JPEG格式图片问题
问题描述 我最近对在线聊天功能进行了一些内存优化#xff0c;结果在回归测试时#xff0c;突然发现有张图片总是发送失败。测试同事把问题转到我这儿来看#xff0c;我仔细检查了一下#xff0c;发现是上传文件的接口报错#…解决ImageIO无法读取部分JPEG格式图片问题
问题描述 我最近对在线聊天功能进行了一些内存优化结果在回归测试时突然发现有张图片总是发送失败。测试同事把问题转到我这儿来看我仔细检查了一下发现是上传文件的接口报错说文件格式不符合要求。乍一看这问题似乎很简单文件格式限制而已。我心想JPEG 格式不应该是允许的么然而当我右键查看文件属性心里瞬间有种不好的预感——这张图片确实是 JPEG 格式的而系统明明允许上传 JPEG 类型的文件。这就变得有趣了。
问题排查 首先我查看了测试环境的日志却没有任何有用的线索。然后打开上传服务的代码检查文件处理的逻辑看起来一切正常没有明显问题。既然看不出来问题那就只能踏踏实实地 debug 了。 服务启动后我用另一张 JPEG 图片测试了一下结果上传成功了。这让我怀疑测试环境的代码和我们本地的版本有差异。于是我再次使用之前总是上传失败的图片测试后同样报了和测试环境一样的错误。我将断点打在文件校验的部分逐行调试结果发现所有的校验步骤都通过了看来问题不在文件类型校验上。继续深入调试发现流程走到了文件为空的逻辑然后直接返回了“不允许上传该文件类型”的错误。这让我摸不着头脑——文件明明有大小而且后端也没有报错怎么会读取不到文件内容
接着我看了一下获取图片内容的代码
BufferedImage image ImageIO.read(fileData.getInputStream());看起来平平无奇但是这个image 对象返回来的确实是null。
问题原因 经过深入分析终于找到了问题的根源ImageIO.read() 方法在 Java 中并不支持 .webp 格式图片的读取。这是因为 ImageIO 类依赖的 SPIService Provider Interface机制只为常见的图片格式如 PNG、JPEG、GIF 等注册了相应的读取器但并没有对较新的 WEBP 格式提供内置支持。 当我们尝试用记事本打开那张图片时发现它的确是 WEBP 格式而不是我们最初以为的 JPEG。这就解释了为什么系统上传失败——ImageIO.read() 方法无法处理 WEBP 格式的文件导致图片无法被正确读取进而触发了文件格式不符合要求的错误。
有问题的JEPG图片数据
正常的JEPG图片数据
问题修复
解决这个问题也非常简单直接在pom文件引入如下组件 dependencygroupIdorg.sejda.imageio/groupIdartifactIdwebp-imageio/artifactIdversion0.1.6/version/dependency然后就可以了