解决ImageIO无法读取部分JPEG格式图片问题

news2024/11/29 7:47:46

解决ImageIO无法读取部分JPEG格式图片问题

问题描述

  我最近对在线聊天功能进行了一些内存优化,结果在回归测试时,突然发现有张图片总是发送失败。测试同事把问题转到我这儿来看,我仔细检查了一下,发现是上传文件的接口报错,说文件格式不符合要求。乍一看这问题似乎很简单,文件格式限制而已。我心想:JPEG 格式不应该是允许的么?然而,当我右键查看文件属性,心里瞬间有种不好的预感——这张图片确实是 JPEG 格式的,而系统明明允许上传 JPEG 类型的文件。这就变得有趣了。

问题排查

  首先,我查看了测试环境的日志,却没有任何有用的线索。然后打开上传服务的代码,检查文件处理的逻辑,看起来一切正常,没有明显问题。既然看不出来问题,那就只能踏踏实实地 debug 了。

  服务启动后,我用另一张 JPEG 图片测试了一下,结果上传成功了。这让我怀疑测试环境的代码和我们本地的版本有差异。于是,我再次使用之前总是上传失败的图片,测试后同样报了和测试环境一样的错误。我将断点打在文件校验的部分,逐行调试,结果发现所有的校验步骤都通过了!看来问题不在文件类型校验上。继续深入调试,发现流程走到了文件为空的逻辑,然后直接返回了“不允许上传该文件类型”的错误。这让我摸不着头脑——文件明明有大小,而且后端也没有报错,怎么会读取不到文件内容?

接着,我看了一下获取图片内容的代码:

BufferedImage image  = ImageIO.read(fileData.getInputStream());

看起来平平无奇,但是这个image 对象返回来的确实是null

问题原因

  经过深入分析,终于找到了问题的根源:ImageIO.read() 方法在 Java 中并不支持 .webp 格式图片的读取。这是因为 ImageIO 类依赖的 SPI(Service Provider Interface)机制,只为常见的图片格式(如 PNGJPEGGIF 等)注册了相应的读取器,但并没有对较新的 WEBP 格式提供内置支持。

  当我们尝试用记事本打开那张图片时,发现它的确是 WEBP 格式,而不是我们最初以为的 JPEG。这就解释了为什么系统上传失败——ImageIO.read() 方法无法处理 WEBP 格式的文件,导致图片无法被正确读取,进而触发了文件格式不符合要求的错误。

有问题的JEPG图片数据:
在这里插入图片描述

正常的JEPG图片数据:
在这里插入图片描述

问题修复

解决这个问题也非常简单,直接在pom文件引入如下组件:

 <dependency>
   <groupId>org.sejda.imageio</groupId>
   <artifactId>webp-imageio</artifactId>
   <version>0.1.6</version>
 </dependency>

然后就可以了!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何解决JMeter响应数据乱码?

问题&#xff1a; 解决&#xff1a; 1、找到JMeter安装目录下的bin目录 2、 在bin目录下&#xff0c;打开" jmeter.properties "文件 3、搜索"sampleresult.default.encoding" 4、改成"sampleresult.default.encodingUTF-8"&#xff0c;去掉前面…

3D数学在unity中的使用(工作小结)

前言&#xff1a; 公司的游戏&#xff0c;想实现一个类似于元气骑士前传的技能面板&#xff0c;这里的技能可以实现旋转替换。 记录一下我遇到的问题及解决办法。 如何生成这些图标 1&#xff1a;手动摆放。 优点&#xff1a;实现起来简单&#xff0c;代码量少。 缺点&…

南平自闭症寄宿制学校在哪里?探索最佳教育选择

在寻找适合自闭症儿童的教育环境时&#xff0c;家长们往往面临诸多挑战。尤其是在南平这样的地区&#xff0c;专业的自闭症寄宿制学校资源相对有限。然而&#xff0c;随着特殊教育领域的不断发展&#xff0c;一些优秀的寄宿制学校已经在全国范围内崭露头角&#xff0c;其中&…

2024年河南省职业技能竞赛(网络建设与运维赛项)

模块二&#xff1a;网络建设与调试 说明&#xff1a; 1.所网络设备在创建之后都可以直接通过 SecureCRT 软件 telnet 远程连接操作。 2.要求在全员化竞赛平台中保留竞赛生成的所有虚拟主机。 3.题目中所有所有的密码均为 Pass-1234&#xff0c;若未按照要求设置&#xff0c;涉 …

OBOO鸥柏丨 21.5 寸自助服务终端机智能科技查询一体新势力

OBOO鸥柏数字化 21.5 寸自助服务终端机以其卓越的表现、丰富的功能和可靠的品质&#xff0c;主要应用于政务办事大厅&#xff0c;自助查档&#xff0c;自助打印&#xff0c;自助办理业务一体机触摸终端&#xff0c;智慧城市营业厅均在当前市场中已经展现出强大的优势。科技触控…

想要加密电脑文件?2024年企业常用的10款电脑加密软件排行榜

在2024年&#xff0c;随着网络安全威胁日益增多&#xff0c;企业对数据安全的需求越来越强烈。电脑文件加密已成为保护敏感信息免受未经授权访问的必备手段。企业为了确保数据安全&#xff0c;往往会选择专业的加密软件&#xff0c;帮助保护文件、文件夹、硬盘、甚至整个系统。…

安科瑞ARB5弧光保护在船舶中压配电板中的应用-安科瑞黄安南

摘要&#xff1a;船舶中压配电板弧光故障导致的设备损坏和停电事故&#xff0c;不仅会造成较大的经济损失&#xff0c;而且严重影响船舶电站的安全稳定运行&#xff0c;威胁船舶电站操作人员的安全。弧光保护是基于电力系统开关柜发生弧光故障时而设计的一套母线保护系统&#…

C++编程语言:抽象机制:构造,清理,复制和移动(Bjarne Stroustrup)

(译注&#xff1a;本章细节非常多&#xff0c;纷繁复杂&#xff0c;一些语法特点体现了似乎在禁止一个问题&#xff0c;但是又在背后开了一个后门&#xff0c;在实践中极其容易出错&#xff0c;需要特别注意每一个细节。) 第17章 构造、清理、复制、和移 (Construction,Clea…

惠普HP35670A, Agilent35670a FFT动态信号分析仪

Keysight 35670A&#xff08;安捷伦&#xff09;FFT 动态信号分析仪是一款多功能 FFT 分析仪&#xff0c;具有内置信号源&#xff0c;可用于一般频谱和网络分析以及倍频程、阶次和相关性分析。内置源具有可选的分析功能&#xff0c;可优化仪器以分析和排除噪声、振动和声学问题…

跟踪一切学习笔记2024

目录 Track-Anything 多目标跟踪分割 masa 多目标检测跟踪: omnimotion iKUN Track-Anything 交互式,选择多个要跟踪的物体,最后是分割 多目标跟踪分割 https://github.com/gaomingqi/Track-Anything masa 多目标检测跟踪:

区块链积分系统:支付领域的新篇章与未来引领

在数字化浪潮汹涌的今天&#xff0c;支付安全及风险管理议题愈发凸显其重要性。交易量的飞速增长让传统支付体系面临效率、合规性和安全性的严峻挑战&#xff0c;亟需新的解决方案。 区块链技术&#xff0c;凭借其独特的去中心化结构、高透明度以及数据不可更改的特性&#xf…

微信支付商家转账到零钱审核不通过解决方法

商家转账到零钱功能通常指的是微信支付提供的一项服务&#xff0c;允许商家将资金转账至用户的微信零钱账户。以下是商家转账到零钱的最优申请方案总结&#xff1a; 一、申请条件确认 1. 主体资格&#xff1a; a.申请主体必须为公司性质&#xff08;有限公司类型&#xff09;…

AI测试入门:理解 LLM 的基准测试(Benchmark)

AI测试入门:理解 LLM 的基准测试(Benchmark) 1. 基准测试的定义2. 基准测试的目的3. 基准测试的常用指标4. 基准测试的流程5. 常用的AI基准测试框架总结1. 基准测试的定义 LLM 的基准测试是一种评估 LLM 的标准化方法,通过使用预定义的数据集、任务和评估指标,对LLM 在特定…

STM32F4-内存管理

1 SRAM的使用 STM32F407自带 192K SRAM&#xff0c;一般应用足够&#xff0c;但对内存要求高时&#xff0c;如算法或GUI&#xff0c;可能不够用。因此&#xff0c;通常在开发板上增加 1M字节SRAM芯片&#xff0c;例如XM8A51216&#xff0c;满足大内存需求。 XM8A51216 是星忆存…

mac安装brew指引

1、根据官网提示 https://brew.sh/ 执行命令行 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装成功后依次执行 echo export PATH"/opt/homebrew/bin:$PATH" >> ~/.bash_profilesource ~…

WinRAR为什么会自动设置密码?取消自动加密的详细方法

在使用WinRAR压缩文件的过程中&#xff0c;部分用户可能会发现压缩文件时总是自动设置密码。这种情况可能会让人感到困惑&#xff0c;特别是在你并不需要对文件加密的时候。本文将解释为什么会发生这种情况&#xff0c;以及如何取消这种自动设置密码的操作&#xff0c;让你的压…

Leetcode 1489. 找到最小生成树里的关键边和伪关键边

1.题目基本信息 1.1.题目描述 给你一个 n 个点的带权无向连通图&#xff0c;节点编号为 0 到 n-1 &#xff0c;同时还有一个数组 edges &#xff0c;其中 edges[i] [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。最小生成树 (MST) 是给定图中边的一…

114.WEB渗透测试-信息收集-ARL(5)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;113.WEB渗透测试-信息收集-ARL&#xff08;4&#xff09; 输入&#xff1a; docker ps 查…

GPT和BERT

GPT和BERT都是基于Trm的应用&#xff0c;可以理解为GPT是decoder的应用&#xff0c;BERT可以说是encoder的应用 GPT 如图&#xff0c;就是GPT的原理&#xff0c;GPT是做生成式的任务的&#xff0c;没有办法进行下游任务改造&#xff0c;训练也是针对生成式的任务进行训练 BE…

【JavaEE】【IO】文件操作

目录 一、文件1.1 文件的概念1.2 文件的操作1.3 路径1.4 文件分类 二、Java中的文件元信息、路径操作2.1 属性2.2 构造方法2.3 方法2.3.1 文件路径2.3.2 文件判断2.3.3 文件创建删除2.3.4 其他操作 三、文件读写操作3.1 流&#xff08;Stream&#xff09;3.1.1 字节流3.1.1.1 I…