java实现minIo实现图片压缩上传

效果:

这是两个一样的图片通过压缩

一个77 一个62.9

首先,在yml文件中或者是你的配置中心加上配置

minio:
  accuracy: 0.5

accuracy 指定图片缩放倍数

其次将该依赖加入maven管理

	<!--图片压缩-->
    <dependency>
      <groupId>net.coobird</groupId>
      <artifactId>thumbnailator</artifactId>
      <version>0.4.8</version>
    </dependency>

然后直接上代码

@Value("${minio.accuracy}")
    private double accuracy;

    /**
     * Minio文件上传接口
     *
     * @param file 上传的文件
     * @return 访问地址
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception
    {
        // 压缩图片
        byte[] scaledImageBytes = scalePic(file, accuracy);

        // 构建上传参数
        String fileName = FileUploadUtils.extractFilename(file); // 假设这个方法可以处理MultipartFile或普通文件名
        ByteArrayInputStream inputStream = new ByteArrayInputStream(scaledImageBytes);
        PutObjectArgs args = PutObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(fileName)
                .stream(inputStream, scaledImageBytes.length, -1)
                .contentType(file.getContentType()) // 注意这里可能需要手动设置正确的MIME类型
                .build();

        // 上传到MinIO
        client.putObject(args);


        // 返回上传后的URL
        return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
    }


    /**
     * 根据指定大小压缩图片
     *
     * @param file  源图片
     * @param accuracy 指定图片缩放倍数
     * @return 压缩质量后的图片字节数组
     * scale 0~1 缩放倍数,1表示不缩放
     */
    public static byte[] scalePic(MultipartFile file,Double accuracy) throws IOException {
        // 压缩图片并保存到临时文件中
        File tempFile = File.createTempFile("thumbnail", ".jpg");
        Thumbnails.of(file.getInputStream())
                .scale(0.8)
                .outputQuality(accuracy)
                .toFile(tempFile);
        // 读取临时文件的字节流设置到输出流中
        InputStream tempInputStream = new FileInputStream(tempFile);
        byte[] buffer = new byte[tempInputStream.available()];
        tempInputStream.read(buffer);
        tempInputStream.close();
        // 删除临时文件
        tempFile.delete();
        // 可以下载到本地看一看,是否真的缩小
        // BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\\Code\\upload\\1.jpg"));
        // bos.write(buffer);
        // bos.close();
        InputStream inputStream = new ByteArrayInputStream(buffer);
        return buffer;
    }

scale是缩放倍数,1为不缩放

值得注意的是我的 密钥以及桶名称都已经在别的类获得了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值