| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package com.bebind.utils;
- import cn.hutool.core.util.IdUtil;
- import com.bebind.vo.MinioUploadResult;
- import io.minio.BucketExistsArgs;
- import io.minio.MakeBucketArgs;
- import io.minio.PutObjectArgs;
- import io.minio.MinioClient;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Component;
- import org.springframework.web.multipart.MultipartFile;
- import java.io.InputStream;
- @Component
- public class MinioUploadUtil {
- @Value("${minio.bucketName}")
- private String bucketName;
- @Value("${minio.previewUrl}")
- private String previewUrl;
- private final MinioClient minioClient;
- // 构造器注入MinioClient
- public MinioUploadUtil(MinioClient minioClient) {
- this.minioClient = minioClient;
- }
- /**
- * 上传图片到MinIO(返回访问链接+MinIO路径)
- * @param file 前端上传的图片文件
- * @return 上传结果(含链接和路径)
- * @throws Exception 上传异常
- */
- public MinioUploadResult uploadImage(MultipartFile file) throws Exception {
- // 1. 校验文件是否为空
- if (file.isEmpty()) {
- throw new IllegalArgumentException("上传的图片文件不能为空");
- }
- // 2. 获取文件原始名称和后缀
- String originalFilename = file.getOriginalFilename();
- assert originalFilename != null;
- String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
- // 3. 生成唯一文件名(避免重复)
- String fileName = IdUtil.simpleUUID() + suffix;
- // 4. 检查桶是否存在,不存在则创建
- if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
- minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
- }
- // 5. 获取文件输入流
- try (InputStream inputStream = file.getInputStream()) {
- // 6. 上传文件到MinIO
- minioClient.putObject(
- PutObjectArgs.builder()
- .bucket(bucketName)
- .object(fileName) // MinIO中存储的文件名
- .stream(inputStream, file.getSize(), -1) // 文件流和大小
- .contentType(file.getContentType()) // 文件类型(如image/jpeg)
- .build()
- );
- }
- // 7. 拼接图片可访问链接
- String imageUrl = previewUrl + bucketName + "/" + fileName;
- // 8. 拼接MinIO存储路径(桶名/文件名)
- String minioPath = bucketName + "/" + fileName;
- // 返回封装后的结果
- return new MinioUploadResult(imageUrl, minioPath);
- }
- }
|