使用Thumbnailator遇到异常:No suitable ImageReader found for source data

使用Thumbnailator工具完成对图片进行裁剪、缩放的处理:

java 复制代码
Thumbnails.of(file.getInputStream()).size(width, height).keepAspectRatio(false).toOutputStream(outputStream);

如果前端传入的是webp格式或者二进制文件,该文件中存储内容为将图片转成base64格式的字符串,部分内容如下:

java 复制代码
data:image/jpeg;base64,
iVBORw0KGgoAAAANSUhEUgAAAfUAAAH1CAYAAADvSGcRAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAP+lSURBVHhetP3n927HsSf24ZKXOQcQBAkCIIic
c84555zTQc45HIRzkHMGiECQBC95Ge4lb5oZjUbyWNLSkrwsjzRjW7I9WsrWkkZakiz9Ae36fGv3
8zuc8fIbL7/otfezd+/u6uqq+lZV997PZt/dYd+x5Q7

会抛出异常:net.coobird.thumbnailator.tasks.UnsupportedFormatException: No suitable ImageReader found for source data.

原因是没有对应的图片解析器处理,那么解决办法有引入第三方依赖:

XML 复制代码
<dependency>
  <groupId>org.sejda.imageio</groupId>
  <artifactId>webp-imageio</artifactId>
  <version>0.1.6</version>
</dependency>

引入依赖后可能会解决第一种webp的问题,第二种问题依然无法解决,所以往往最普通的办法就是最使用的办法,这里通过最原始的流获取字节数组,将该字节数组读出到输出流并转换成字符串就是该二进制文件中所有的内容,即与原部分数据一致。

java 复制代码
public String ImageFileToBase64(MultipartFile multipartFile){
	String content;
	try {
        InputStream inputStream = multipartFile.getInputStream();
        //<1>创建字节数组输出流,用来输出读取到的内容
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //<2>创建缓存大小
        byte[] buffer = new byte[1024]; // 1KB
        //每次读取到内容的长度
        int len = -1;
        //<3>开始读取输入流中的内容
        while ((len = inputStream.read(buffer)) != -1) { //当等于-1说明没有数据可以读取了
            baos.write(buffer, 0, len);   //把读取到的内容写到输出流中
        }
        //<4> 把字节数组转换为字符串
        content = baos.toString();
        //<5>关闭输入流和输出流
        inputStream.close();
        baos.close();
	}catch (Exception e){
    	log.error("文件解析错误",e);
    	throw new BusinessException(ErrorCode.SYSTEM_ERROR);
	}

	//<6>返回字符串结果
	return content;
}

再将data:image/jpeg;base64,过滤掉,

通过java原生的Base64.getDecoder().decode(),转换成字节数组的形式,

最后再使用new MockMultipartFile(),将字节数组转化为MultipartFile对象。

问题得以解决。其中contentType从data:image/jpeg;base64,中截取image/jpeg。

java 复制代码
String base64 = imageUtils.ImageFileToBase64(thumbnailFile);
String[] parts = base64.split(",");
String contentType = parts[0].split(";")[0].split(":")[1];
byte[] bytes = Base64.getDecoder().decode(parts[1]);
MultipartFile newThumbnailFile = new MockMultipartFile(thumbnailFile.getOriginalFilename(), thumbnailFile.getOriginalFilename(), contentType, bytes);

后续使用newThumbnailFile进行对文件的处理即可。

相关推荐
古法安卓2 小时前
Android-日志系统源码解析
android·java·android studio
小夏coding4 小时前
从"一把梭"到"精妙拆解" —— 滑动窗口计时框架的设计演进
java·后端
MacroZheng5 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"
java·人工智能·后端
十年Java程序媛6 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套
java·spring boot
xiaoqiMikko6 小时前
有人在搜一个不存在的 Tomcat 版本
java·tomcat
用户31268748772010 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
vipxieliang10 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing10 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
吃饱了得干活10 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式
java·spring boot·后端
lhldsg12 小时前
AI零售系统实战指南:从架构设计到落地部署全解析
java·人工智能·小程序·uni-app·零售