1. 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.20</version>
</dependency>
</dependencies>
2. Controller层
一个简单的测试接口
@RestController
public class ImgController {
@Resource
private ImgService imgService;
@PostMapping("img/upload")
public String uploadImg(@RequestParam("img")MultipartFile file){
imgService.uploadImg(file);
return "success";
}
}
3. Service层
使用异步方法,是因为图片处理需要时间,可以不用等待处理结果
记得@EnableAsync开启异步,这里简单测试使用就不设置线程池了
@Service
public class ImgServiceImpl implements ImgService {
@Override
@Async
public void uploadImg(MultipartFile file) {
//获取文件名
String fileName = file.getOriginalFilename();
//判空,可抛出自定义异常
Optional.ofNullable(fileName).orElseThrow();
//获取后缀
String suffix = fileName.substring(fileName.indexOf("."));
File sourceFile = null;
try {
//创建临时文件
sourceFile = File.createTempFile(UUID.randomUUID().toString().replace("-",""), suffix);
//将上传文件传输给临时文件,因为方法为异步时,multipartFile对象会在Controller层接口返回时被回收
file.transferTo(sourceFile);
} catch (IOException e) {
System.out.println("图片传输失败 :"+e.getMessage());
}
//创建目标文件
File targetFile = new File("D:/picture/"+ UUID.randomUUID().toString().replace("-","")+suffix);
//进行缩略操作
try {
PictureHandle.outputQuality(sourceFile,targetFile);
} catch (IOException e) {
System.out.println("图片处理失败 :"+e.getMessage());
}
//删除临时文件
sourceFile.delete();
}
}
4. 略缩图工具类
public class PictureHandle {
/**
* 要创建分辨率为原始图片 50% 的缩略图
*/
public static void halfResolution(File source,File target) throws IOException {
Thumbnails
//传入源文件
.of(source)
//设置分辨率比例因子,不能小于0.0
.scale(0.5d)
//目标文件
.toFile(target);
}
/**
* 创建分辨率为640x480的略缩图,并在此基础上,保留原始图像的纵横比
*/
public static void formatResolution(File source,File target) throws IOException {
Thumbnails
//传入源文件
.of(source)
//生成缩略图的宽高
.size(640,480)
//保留原始图像纵横比
.keepAspectRatio(true)
//目标文件
.toFile(target);
}
/**
* 保持原始分辨率,减低图片质量
*/
public static void outputQuality(File source,File target) throws IOException {
Thumbnails
//传入源文件
.of(source)
//原始分辨率
.scale(1.0d)
//输出图片质量,该值介于 double 和 1.0d 和 0.0d之间,值越高质量越高
.outputQuality(0.5d)
//目标文件
.toFile(target);
}
}
5. 总结
上述只是一个简单的使用案例,可以根据项目需求自行调整
thumbnailator是一个单一的JAR文件,不依赖于外部库,使开发和部署变得简单易行,他还可以实现图片的旋转,加水印等功能
详细使用可以参考官方文档:Thumbnailator API Documentation (Version 0.4.20)