使用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,具体解决办法:

java怎么把MultipartFile转换成File_spring

根据多次测试得来的结果:用jpg转成jpg效果最佳。所以当图片为png时,先改成jpg格式,再进行压缩。

总结: 好了,到此压缩图片的功能就完成了,虽然是一个小小的功能,但是遇到了不少坑,当做经验教训,继续努力吧!