使用Thumbnails压缩MultipartFile类型图片,并转成base64形式
1.导入依赖
<!-- 图片缩略图 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
2.主要代码
/**
* 完成图片处理
* @param file :用户上传的图片文件
* @return :图片的base64编码格式
*/
public String uploadImage(MultipartFile file) throws IOException {
String contentType = file.getContentType();
MultipartFile oldMultipartFile = file;
System.out.println("filesize:"+file.getSize());
//如果图片大小小于20kb,则无需压缩,并且直接返回原文件的base64编码
if(file.getSize() <= 1024*20){
//使用DataURL的形式存储图片(对图片进行base64编码)
return "data:"+contentType+";base64,"+ Base64.encodeBase64String(file.getBytes());
}else{
//大小大于20kb,进行压缩
//生成后的图片路径(根据自己的路径改,至于为什么是jpg格式一会解释)
String absolutePath = "d:/file/"+UUID.randomUUID()+".jpg";
File tempFile = new File(absolutePath);
//主要操作,先将文件的长宽变小,再进行压缩
Thumbnails.of(file.getInputStream()).size(500,500).outputQuality(0.25d).toFile(tempFile);
//将file类型的文件转成MultipartFile 类型的
FileInputStream fileInputStream = new FileInputStream(tempFile);
MultipartFile multipartFile = new MockMultipartFile(tempFile.getName(),tempFile.getName(),"image/jpg",fileInputStream);
//使用DataURL的形式存储图片(对图片进行base64编码),返回压缩后图片的base64编码
return "data:"+multipartFile.getContentType()+";base64,"+ Base64.encodeBase64String(multipartFile.getBytes());
}
}
3.contorller层
@Autowired
private StudyingChannelService studyingChannelService;
@RequestMapping("/upload")
public Result upload(@RequestParam(name="file") MultipartFile file) throws IOException {
//1.调用service保存图片(获取到图片的访问地址(dataUrl | http地址))
String imgUrl = studyingChannelService.uploadImage(file);
//2.返回数据
return new Result(ResultCode.SUCCESS,imgUrl);
}
4.注意!!!非常重要!在完成这个功能时我遇到的坑,给大家避雷:
坑1:springboot支持的MultipartFile图片的大小默认为1M
SpringBoot上传文件大小不能超过1M,所以图片稍微一大点,后台就会报错:
org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.
解决办法:在配置文件(application.properties/application.yml)中加入如下设置:
低版本: 1.X
spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=10MB
高版本: 2.X
spring.servlet.multipart.max-file-size=30Mb
spring.servlet.multipart.max-request-size=30Mb
坑2:如果使用了Thumbnails的scale(缩放)效果,压缩后的图片可能会变大(本例中没有使用)
当解决上述问题之后,本以为压缩完成,高高兴兴的打开图片,想查看一下压缩后的图片大小,结果惊奇的发现---------------图片变大了。。变大了?大了?
为什么?图片会越压缩越大???这不符合常理啊...
经过我的查询,发现Thumbnails应该是存在bug,具体解决办法:
根据多次测试得来的结果:用jpg转成jpg效果最佳。所以当图片为png时,先改成jpg格式,再进行压缩。
总结: 好了,到此压缩图片的功能就完成了,虽然是一个小小的功能,但是遇到了不少坑,当做经验教训,继续努力吧!