MinioUploadUtil.java 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package com.bebind.utils;
  2. import cn.hutool.core.util.IdUtil;
  3. import com.bebind.vo.MinioUploadResult;
  4. import io.minio.BucketExistsArgs;
  5. import io.minio.MakeBucketArgs;
  6. import io.minio.PutObjectArgs;
  7. import io.minio.MinioClient;
  8. import org.springframework.beans.factory.annotation.Value;
  9. import org.springframework.stereotype.Component;
  10. import org.springframework.web.multipart.MultipartFile;
  11. import java.io.InputStream;
  12. @Component
  13. public class MinioUploadUtil {
  14. @Value("${minio.bucketName}")
  15. private String bucketName;
  16. @Value("${minio.previewUrl}")
  17. private String previewUrl;
  18. private final MinioClient minioClient;
  19. // 构造器注入MinioClient
  20. public MinioUploadUtil(MinioClient minioClient) {
  21. this.minioClient = minioClient;
  22. }
  23. /**
  24. * 上传图片到MinIO(返回访问链接+MinIO路径)
  25. * @param file 前端上传的图片文件
  26. * @return 上传结果(含链接和路径)
  27. * @throws Exception 上传异常
  28. */
  29. public MinioUploadResult uploadImage(MultipartFile file) throws Exception {
  30. // 1. 校验文件是否为空
  31. if (file.isEmpty()) {
  32. throw new IllegalArgumentException("上传的图片文件不能为空");
  33. }
  34. // 2. 获取文件原始名称和后缀
  35. String originalFilename = file.getOriginalFilename();
  36. assert originalFilename != null;
  37. String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
  38. // 3. 生成唯一文件名(避免重复)
  39. String fileName = IdUtil.simpleUUID() + suffix;
  40. // 4. 检查桶是否存在,不存在则创建
  41. if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
  42. minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
  43. }
  44. // 5. 获取文件输入流
  45. try (InputStream inputStream = file.getInputStream()) {
  46. // 6. 上传文件到MinIO
  47. minioClient.putObject(
  48. PutObjectArgs.builder()
  49. .bucket(bucketName)
  50. .object(fileName) // MinIO中存储的文件名
  51. .stream(inputStream, file.getSize(), -1) // 文件流和大小
  52. .contentType(file.getContentType()) // 文件类型(如image/jpeg)
  53. .build()
  54. );
  55. }
  56. // 7. 拼接图片可访问链接
  57. String imageUrl = previewUrl + bucketName + "/" + fileName;
  58. // 8. 拼接MinIO存储路径(桶名/文件名)
  59. String minioPath = bucketName + "/" + fileName;
  60. // 返回封装后的结果
  61. return new MinioUploadResult(imageUrl, minioPath);
  62. }
  63. }