Java使用 Thumbnails 压缩图片

业务:用户上传一张图片到文件站,需要返回原图url和缩略图url

处理思路:

  1. 因为上传图片方法返回url是单个上传,第一步先上传原图并返回url
  2. 处理缩略图并上传:拿到MultipartFile压缩成缩略图后存放到项目内指定文件夹
  3. 用项目内新生成的缩略图转换为MultipartFile发送给图片上传方法得到url
  4. 流程处理完后删除存放在项目内的缩略图
public void imageMethod(MultipartFile file){

        //region/-------创建缩略图存放的文件夹-------/
        //获得项目根目录
        String path = System.getProperty("user.dir");
        //定义新文件夹路径
        String dirPath = path + File.separator + "imagecache";
        //根据路径生成文件夹
        File dir = new File(dirPath);
        dir.mkdirs();
        //endregion

        //定义缩略图的全路径
        String fileSuffix = "image.jpg";
        String contextPath = dirPath + File.separator + fileSuffix;

        //压缩图片
        MultipartFile newFile = null;
        try {
            //自定义宽高压缩(压缩方法很多,可以根据需求更改)
            Thumbnails.of(file.getInputStream()).forceSize(100, 100).toFile(contextPath);

            //压缩完成后将缩略图生成MultipartFile
            FileItem fileItem = createFileItem(contextPath);
            newFile = new CommonsMultipartFile(fileItem);

        } catch (IOException e) {
            e.printStackTrace();
        }
        //endregion

        //上面的"newFile"就是缩略图转换后的MultipartFile,就可以拿来用了

        //程序处理完后把生成的缩略图删除
        File image = new File(contextPath);
        if (image.exists()) {
            image.delete();
        }

    }

    /**
     * 获取压缩后的图片,File 转为 MultipartFile
     *
     */
    public FileItem createFileItem(String contextPath) {
        {
            FileItemFactory factory = new DiskFileItemFactory(16, null);
            String textFieldName = "textField";
            int num = contextPath.lastIndexOf(".");
            String extFile = contextPath.substring(num);
            FileItem item = factory.createItem(textFieldName, "text/plain", true,
                    "MyFileName" + extFile);
            File newfile = new File(contextPath);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            try {
                FileInputStream fis = new FileInputStream(newfile);
                OutputStream os = item.getOutputStream();
                while ((bytesRead = fis.read(buffer, 0, 8192))
                        != -1) {
                    os.write(buffer, 0, bytesRead);
                }
                os.close();
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return item;
        }
    }

Original: https://www.cnblogs.com/jeffreyu/p/13045140.html
Author: jeffreyu
Title: Java使用 Thumbnails 压缩图片

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593307/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 竟然有一半的人不知道 for 与 foreach 的区别???

    之前有一个同事突然我问了我一个问题,说在foreach当中能不能删除list里面的元素,我当时大概说了一下是否能删除,以及原因;接下来我们来探讨一下是否能够如此; 首先,我们一一段…

    Java 2023年5月29日
    088
  • 老生常谈系列之Aop–JDK动态代理的底层实现原理

    老生常谈系列之Aop–JDK动态代理的底层实现原理 前言 在Aop系列里面有两篇文章,分别是老生常谈系列之Aop–Spring Aop原理浅析和老生常谈系列…

    Java 2023年6月8日
    074
  • 日期工具类

    package com.houserent.common.util;import java.text.ParseException;import java.text.SimpleD…

    Java 2023年6月7日
    065
  • 索引有什么分类?

    索引有什么分类? – 1、主键索引:名为primary的唯一非空索引,不允许有空值。 – 2、唯一索引:索引列中的值必须是唯一的,但是允许为空值。唯一索引和…

    Java 2023年6月5日
    066
  • MyBatis-Plus联表查询的短板,终于有一款工具补齐了

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处。 哈喽大家好啊,我是Hydra。 my…

    Java 2023年6月5日
    080
  • [spring]spring静态代理和aop

    10.代理模式 代理模式的分类: 静态代理 动态代理 关系分析 抽象角色:一般会使用接口或者抽象类 真实角色:被代理的角色 代理角色:代理真实的角色,做一些附属的操作 客户:访问代…

    Java 2023年6月6日
    064
  • LOVE×EVOLUTION 汉化补丁

    【遊戲名稱/Name】:LOVE×EVOLUTION【遊戲廠商/Company】:evee【發售日期/Sale date】:2009/08/18 介绍: 这个好像就是所谓GALGA…

    Java 2023年5月29日
    0100
  • springboot集成swagger,出现 No mapping for GET /swagger-ui.html的错误

    在尝试降低springboot版本和swagger版本都无法解决这个问题后 在SpringBoot项目引入Swagger2后,在浏览器地址里输入地址:http://ip:port/…

    Java 2023年5月30日
    056
  • Spring Boot+RabbitMQ 通过fanout模式实现消息接收(支持消费者多实例部署)

    本文章适用的场景:同一条消息可以被多个消费者 同时消费。注意:当消费者多实例部署时,会轮询消费消息。网上有大量的的案例展示:P生产一条消息,消费者服务C中建立Q1和Q2两个队列共同…

    Java 2023年6月7日
    090
  • 和朱晔一起复习Java并发(三):锁(含锁性能测试)

    这个专题我发现怎么慢慢演化为性能测试了,遇到任何东西我就忍不住去测一把。本文我们会大概看一下各种锁数据结构的简单用法,顺便也会来比拼一下性能。 各种并发锁 首先,我们定一个抽象基类…

    Java 2023年5月29日
    079
  • 【Redis】Redis Cluster-集群请求命令处理

    集群请求命令处理 在Redis的命令处理函数 processCommand(server.c)中有对集群节点的处理,满足以下条件时进入集群节点处理逻辑中: 启用了集群模式,通过 s…

    Java 2023年6月8日
    090
  • 船舱订票系统测试

    package com.dong.mytest.demo.other.yan; import java.util.ArrayList; import java.util.HashM…

    Java 2023年6月5日
    076
  • SpringMVC(2)-注解开发MVC

    项目目录 一.创建maven项目,添加web支持,在pom.xml问价引入一下代码 <build> <resources> <resource>…

    Java 2023年6月9日
    069
  • Python 知识点总结

    本知识点总结由@Chi-Tang编写 是 Python 最常用的一种数据结构,用一组方括号括起来、用逗号分隔开的一组数据。 列表的元素可以是任意类型,但使用时通常各个元素的类型是相…

    Java 2023年6月7日
    049
  • 简述一条查询语句的执行过程

    大体来说,MySQL 可以分为 Server 层和 存储引擎层两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等 存储引擎层负责数据的存储和提取。 一个查询语…

    Java 2023年6月5日
    071
  • 一次线上图片打印失败问题排查

    01 问题由来 昨天产品在测试系统的时候,提了个bug,有个功能打印图片时,图片无法显示。为了重现这个bug,特意去测试环境看了下,还真存在,于是去看错误日志,发现报异常了。 在某…

    Java 2023年6月5日
    0162
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球