效果:
这是两个一样的图片通过压缩
一个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为不缩放
值得注意的是我的 密钥以及桶名称都已经在别的类获得了