From 0db709cb3e84ec6920aef93a195099957f0779d4 Mon Sep 17 00:00:00 2001 From: none Date: Mon, 6 Mar 2023 18:23:34 +0800 Subject: [PATCH] =?UTF-8?q?minio=E5=88=86=E7=89=87=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xyz/playedu/api/config/MinioConfig.java | 8 +++ .../controller/backend/UploadController.java | 65 ++++++++++++++++--- .../api/vendor/PlayEduMinioClient.java | 41 ++++++++++++ 3 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 src/main/java/xyz/playedu/api/vendor/PlayEduMinioClient.java diff --git a/src/main/java/xyz/playedu/api/config/MinioConfig.java b/src/main/java/xyz/playedu/api/config/MinioConfig.java index a70e609..7c4d5dc 100644 --- a/src/main/java/xyz/playedu/api/config/MinioConfig.java +++ b/src/main/java/xyz/playedu/api/config/MinioConfig.java @@ -1,10 +1,12 @@ package xyz.playedu.api.config; +import io.minio.MinioAsyncClient; import io.minio.MinioClient; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import xyz.playedu.api.vendor.PlayEduMinioClient; /** * @Author 杭州白书科技有限公司 @@ -36,4 +38,10 @@ public class MinioConfig { .credentials(this.accessKey, this.secretKey) .build(); } + + @Bean + public PlayEduMinioClient getPlayEduMinioClient() { + MinioAsyncClient client = PlayEduMinioClient.builder().endpoint(this.endPoint).credentials(this.accessKey, this.secretKey).build(); + return new PlayEduMinioClient(client); + } } diff --git a/src/main/java/xyz/playedu/api/controller/backend/UploadController.java b/src/main/java/xyz/playedu/api/controller/backend/UploadController.java index cb9afb3..eb78773 100644 --- a/src/main/java/xyz/playedu/api/controller/backend/UploadController.java +++ b/src/main/java/xyz/playedu/api/controller/backend/UploadController.java @@ -1,9 +1,11 @@ package xyz.playedu.api.controller.backend; +import com.google.common.collect.Multimap; import io.minio.*; import io.minio.http.Method; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; +import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -14,8 +16,8 @@ import xyz.playedu.api.service.ResourceCategoryService; import xyz.playedu.api.service.ResourceService; import xyz.playedu.api.types.JsonResponse; import xyz.playedu.api.util.HelperUtil; +import xyz.playedu.api.vendor.PlayEduMinioClient; -import java.time.ZonedDateTime; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -41,6 +43,9 @@ public class UploadController { @Autowired private MinioClient minioClient; + @Autowired + private PlayEduMinioClient playEduMinioClient; + @PostMapping("/image") public JsonResponse image(@RequestParam HashMap params, MultipartFile file) { if (file == null || file.isEmpty() || file.getOriginalFilename() == null) { @@ -86,10 +91,10 @@ public class UploadController { } } - @GetMapping("/minio-token") - public JsonResponse minioToken(@RequestParam HashMap params) { + @GetMapping("/minio-upload-id") + public JsonResponse minioUploadId(@RequestParam HashMap params) { String extension = MapUtils.getString(params, "extension"); - if (extension == null || extension.isEmpty()) { + if (extension == null || extension.trim().length() == 0) { return JsonResponse.error("extension参数为空"); } String contentType = BackendConstant.RESOURCE_EXT_2_CONTENT_TYPE.get(extension.toLowerCase()); @@ -99,15 +104,41 @@ public class UploadController { String resourceType = BackendConstant.RESOURCE_EXT_2_TYPE.get(extension.toLowerCase()); try { - String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder() - .bucket(minioConfig.getBucket()) - .object(HelperUtil.randomString(32) + "." + extension) - .method(Method.PUT) - .expiry(60 * 60 * 24) - .build()); + String filename = HelperUtil.randomString(32) + "." + extension; + String uploadId = playEduMinioClient.uploadId(minioConfig.getBucket(), filename); HashMap data = new HashMap<>(); data.put("resource_type", resourceType); + data.put("upload_id", uploadId); + data.put("filename", filename); + + return JsonResponse.data(data); + } catch (Exception e) { + log.error(e.getMessage()); + return JsonResponse.error("系统错误"); + } + } + + @GetMapping("/minio-pre-sign-url") + public JsonResponse minioPreSignUrl(@RequestParam HashMap params) { + String uploadId = MapUtils.getString(params, "upload_id"); + Integer partNumber = MapUtils.getInteger(params, "part_number"); + String filename = MapUtils.getString(params, "filename"); + + try { + Map extraQueryParams = new HashMap<>(); + extraQueryParams.put("partNumber", partNumber + ""); + extraQueryParams.put("uploadId", uploadId); + + String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder() + .bucket(minioConfig.getBucket()) + .object(filename) + .method(Method.PUT) + .expiry(60 * 60 * 24) + .extraQueryParams(extraQueryParams) + .build()); + + HashMap data = new HashMap<>(); data.put("url", url); return JsonResponse.data(data); @@ -117,4 +148,18 @@ public class UploadController { } } + @GetMapping("/minio-merge") + public JsonResponse minioMerge(@RequestParam HashMap params) { + String filename = MapUtils.getString(params, "filename"); + String uploadId = MapUtils.getString(params, "upload_id"); + if (filename == null || filename.trim().length() == 0) { + return JsonResponse.error("filename必填"); + } + if (uploadId == null || uploadId.trim().length() == 0) { + return JsonResponse.error("uploadId必填"); + } + playEduMinioClient.merge(minioConfig.getBucket(), filename, uploadId); + return JsonResponse.success(); + } + } diff --git a/src/main/java/xyz/playedu/api/vendor/PlayEduMinioClient.java b/src/main/java/xyz/playedu/api/vendor/PlayEduMinioClient.java new file mode 100644 index 0000000..c67829f --- /dev/null +++ b/src/main/java/xyz/playedu/api/vendor/PlayEduMinioClient.java @@ -0,0 +1,41 @@ +package xyz.playedu.api.vendor; + +import io.minio.CreateMultipartUploadResponse; +import io.minio.ListPartsResponse; +import io.minio.MinioAsyncClient; +import io.minio.messages.Part; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/3/6 16:12 + */ +@Slf4j +public class PlayEduMinioClient extends MinioAsyncClient { + public PlayEduMinioClient(MinioAsyncClient client) { + super(client); + } + + @SneakyThrows + public String uploadId(String bucket, String filename) { + CreateMultipartUploadResponse response = super.createMultipartUpload(bucket, null, filename, null, null); + return response.result().uploadId(); + } + + @SneakyThrows + public void merge(String bucketName, String objectName, String uploadId) { + ListPartsResponse listPartsResponse = super.listParts(bucketName, null, objectName, 10000, 0, uploadId, null, null); + List partList = listPartsResponse.result().partList(); + Part[] parts = new Part[10000]; + int partNumber = 1; + for (Part part : partList) { + log.info("partList {}", part.partSize()); + parts[partNumber - 1] = new Part(partNumber, part.etag()); + partNumber++; + } + super.completeMultipartUpload(bucketName, null, objectName, uploadId, parts, null, null); + } +}