WXF преди 3 години
родител
ревизия
a684ed9fa0

+ 5 - 2
simulation-resource-common/src/main/java/com/css/simulation/resource/common/configuration/minio/MinioConfiguration.java

@@ -10,15 +10,18 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 @ConfigurationProperties(prefix = "minio")
 public class MinioConfiguration {
+
     private String endpoint;
     private String accessKey;
     private String secretKey;
 
     @Bean
-    public MinioClient minioClient() {
-        return MinioClient.builder()
+    public SubMinioClient minioClient() {
+        MinioClient minioClient = MinioClient.builder()
                 .endpoint(endpoint)
                 .credentials(accessKey, secretKey)
                 .build();
+        return new SubMinioClient(minioClient);
     }
+
 }

+ 37 - 0
simulation-resource-common/src/main/java/com/css/simulation/resource/common/configuration/minio/SubMinioClient.java

@@ -0,0 +1,37 @@
+package com.css.simulation.resource.common.configuration.minio;
+
+import com.google.common.collect.Multimap;
+import io.minio.CreateMultipartUploadResponse;
+import io.minio.ListPartsResponse;
+import io.minio.MinioClient;
+import io.minio.ObjectWriteResponse;
+import io.minio.errors.*;
+import io.minio.messages.Part;
+
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+
+public class SubMinioClient extends MinioClient {
+
+    protected SubMinioClient(MinioClient client) {
+        super(client);
+    }
+
+    @Override
+    public CreateMultipartUploadResponse createMultipartUpload(String bucketName, String region, String objectName, Multimap<String, String> headers, Multimap<String, String> extraQueryParams) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InsufficientDataException, ServerException, InternalException, XmlParserException, InvalidResponseException, ErrorResponseException {
+        return super.createMultipartUpload(bucketName,region,objectName,headers,extraQueryParams);
+    }
+
+    @Override
+    public ObjectWriteResponse completeMultipartUpload(String bucketName, String region, String objectName, String uploadId, Part[] parts, Multimap<String, String> extraHeaders, Multimap<String, String> extraQueryParams) throws NoSuchAlgorithmException, InsufficientDataException, IOException, InvalidKeyException, ServerException, XmlParserException, ErrorResponseException, InternalException, InvalidResponseException {
+        return super.completeMultipartUpload(bucketName, region, objectName, uploadId, parts, extraHeaders, extraQueryParams);
+    }
+
+    @Override
+    public ListPartsResponse listParts(String bucketName, String region, String objectName, Integer maxParts, Integer partNumberMarker, String uploadId, Multimap<String, String> extraHeaders, Multimap<String, String> extraQueryParams) throws NoSuchAlgorithmException, InsufficientDataException, IOException, InvalidKeyException, ServerException, XmlParserException, ErrorResponseException, InternalException, InvalidResponseException {
+        return super.listParts(bucketName, region, objectName, maxParts, partNumberMarker, uploadId, extraHeaders, extraQueryParams);
+    }
+
+}

+ 62 - 5
simulation-resource-common/src/main/java/com/css/simulation/resource/common/controller/MinioController.java

@@ -4,11 +4,14 @@ import api.common.pojo.common.ResponseBodyVO;
 import api.common.pojo.constants.DictConstants;
 import api.common.pojo.param.MinioParameter;
 import api.common.util.FileUtil;
+import api.common.util.ObjectUtil;
 import api.common.util.TimeUtil;
+import com.css.simulation.resource.common.configuration.minio.SubMinioClient;
 import com.css.simulation.resource.common.util.MinioUtil;
-import io.minio.MinioClient;
+import io.minio.*;
 import io.minio.errors.*;
 import io.minio.http.Method;
+import io.minio.messages.Part;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.MediaType;
@@ -23,16 +26,14 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping("/minio")
 public class MinioController {
 
     @Resource
-    private MinioClient minioClient;
+    private SubMinioClient minioClient;
 
     @Value("${minio.bucket-name}")
     private String bucketName;
@@ -133,4 +134,60 @@ public class MinioController {
         FileUtil.downloadForHttp(fileName, inputStream, response, 1024);
     }
 
+    @RequestMapping("/createMultipartUpload")
+    @ResponseBody
+    public ResponseBodyVO createMultipartUpload(@RequestBody Map<String,String> paramMap) throws Exception {
+        String objectName = paramMap.get("objectName");
+        String chunkSize = paramMap.get("chunkSize");
+        String type = paramMap.get("type");
+        if(ObjectUtil.isNull(objectName) || ObjectUtil.isNull(chunkSize) || ObjectUtil.isNull(type)){
+            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE,"请求参数缺失");
+        }
+        Integer nowTime = TimeUtil.getRq(new Date(), 0);
+        if (type.equals(DictConstants.ALGORITHM_FILE)) {
+            objectName = "algorithm/" + nowTime + "/" + objectName;
+        }
+        Map<String,Object> result = new HashMap<>();//结果数据
+        CreateMultipartUploadResponse multipartUpload = minioClient.createMultipartUpload(bucketName, null, objectName, null, null);
+        String uploadId = multipartUpload.result().uploadId();
+        List<String> UrlList = new LinkedList<>();
+        Map<String,String> queryParam = new HashMap();
+        queryParam.put("uploadId",uploadId);
+        int size = Integer.valueOf(chunkSize);
+        for (int i = 1; i <= size; i++) {
+            queryParam.put("partNumber",String.valueOf(i));
+            String presignedObjectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
+                    .method(Method.PUT)
+                    .bucket(bucketName)
+                    .object(objectName)
+                    .expiry(60 * 60)//上传URL有效期
+                    .extraQueryParams(queryParam)
+                    .build());
+            UrlList.add(presignedObjectUrl);
+        }
+        result.put("uploadId",uploadId);
+        result.put("uploadUrls",UrlList);
+        result.put("objectName",objectName);
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS,result);
+    }
+
+    @RequestMapping("/completeMultipartUpload")
+    @ResponseBody
+    public ResponseBodyVO completeMultipartUpload(@RequestBody Map<String,String> paramMap) throws Exception {
+        String objectName = paramMap.get("objectName");
+        String uploadId = paramMap.get("uploadId");
+        if(ObjectUtil.isNull(objectName) || ObjectUtil.isNull(uploadId)){
+            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE,"请求参数缺失");
+        }
+        ListPartsResponse listPartsResponse = minioClient.listParts(bucketName, null, objectName, 10000, 0, uploadId, null, null);
+        List<Part> parts = listPartsResponse.result().partList();
+        Part[] partArr = new Part[parts.size()];
+        int partNumber = 1;
+        for (Part part: parts) {
+            partArr[partNumber-1] = new Part(partNumber,part.etag());
+            partNumber++;
+        }
+        minioClient.completeMultipartUpload(bucketName,null,objectName,uploadId,partArr,null,null);
+        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS,"合并成功");
+    }
 }