WXF 3 лет назад
Родитель
Сommit
8ec425fab1

+ 2 - 0
api-common/src/main/java/api/common/pojo/constants/DictConstants.java

@@ -6,6 +6,8 @@ public class DictConstants {
     public static final String BASE_KEY = "DICT:";
     public static final String LIST_KEY = "LIST:";
     public static final String MAP_KEY = "MAP:";
+    //文件长传进度key
+    public static final String ALGORITHM_KEY = "ALGORITHM:";
 
     //字典类型
     public static final String LEVEL = "level";//级别

+ 39 - 9
simulation-resource-common/src/main/java/com/css/simulation/resource/common/util/MinioUtil.java

@@ -1,7 +1,10 @@
 package com.css.simulation.resource.common.util;
 
+import api.common.pojo.constants.DictConstants;
+import api.common.pojo.param.RedisParameter;
+import api.common.util.ObjectUtil;
 import com.css.simulation.resource.common.controller.RedisController;
-import com.css.simulation.resource.common.util.processbar.ProgressStream;
+import com.css.simulation.resource.common.util.processbar.ProgressInputStream;
 import io.minio.*;
 import io.minio.errors.ErrorResponseException;
 import io.minio.errors.InsufficientDataException;
@@ -12,7 +15,6 @@ import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.BufferedInputStream;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.security.InvalidKeyException;
@@ -132,13 +134,26 @@ public class MinioUtil {
             RedisController redisController
     ) throws IOException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, io.minio.errors.InternalException {
         InputStream inputStream = multipartFile.getInputStream();
-        InputStream pis =
-                new BufferedInputStream(
-                        new ProgressStream(redisController, objectPath, inputStream));
-        minioClient.putObject(
-                PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(
-                        pis, pis.available(), -1)
-                        .build());
+        long fileSize = multipartFile.getSize();
+        //进度计算参数:传输量,进度标尺,文件大小,进度值
+        long[] longs = {0L, 0L, fileSize, 0L};
+        InputStream pis = new BufferedInputStream(
+                new ProgressInputStream(inputStream){
+                    @Override
+                    public void getStep(int readBytes){
+                        RedisParameter redisParameter = getProgress(readBytes,longs);
+                        if(ObjectUtil.isNotNull(redisParameter)){
+                            //System.out.println("progress----:" + redisParameter.getValue());
+                            redisParameter.setKey(DictConstants.ALGORITHM_KEY + objectPath);//进度缓存的 key
+                            redisController.set(redisParameter);
+                        }
+                    }
+                });
+        minioClient.putObject(PutObjectArgs.builder()
+                .bucket(bucketName)
+                .object(objectName)
+                .stream(pis, fileSize, -1)
+                .build());
         pis.close();
     }
 
@@ -171,4 +186,19 @@ public class MinioUtil {
                 .object(objectName)
                 .build());
     }
+
+    public static RedisParameter getProgress(int readBytes,long[] longs){
+        double progressStep = 0.05;//进度条的步长
+        longs[0] += readBytes;//累加
+        if(longs[0] >= longs[1]){
+            longs[3] += 1;
+            double progress = progressStep * longs[3];//进度
+            longs[1] = (long) (longs[2] * progress);//标尺增长
+            RedisParameter redisParameter = new RedisParameter();
+            redisParameter.setValue(String.format("%.2f",progress-progressStep));
+            redisParameter.setMinutes(1);
+            return redisParameter;
+        }
+        return null;
+    }
 }

+ 27 - 0
simulation-resource-common/src/main/java/com/css/simulation/resource/common/util/processbar/ProgressInputStream.java

@@ -0,0 +1,27 @@
+package com.css.simulation.resource.common.util.processbar;
+
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ProgressInputStream extends BufferedInputStream {
+
+
+    public ProgressInputStream(InputStream in){
+        super(in);
+    }
+
+
+    @Override
+    public int read(byte[] toStore, int off, int len) throws IOException {
+        int readBytes = this.in.read(toStore, off, len);
+        getStep(readBytes);
+        return readBytes;
+    }
+
+
+    public void getStep(int readBytes){
+        System.out.println("getStep:" + readBytes);
+    }
+}

+ 2 - 2
simulation-resource-server/src/main/java/com/css/simulation/resource/feign/FileDownService.java

@@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.multipart.MultipartFile;
 
 
-//@FeignClient(name = "test", url = "http://10.15.12.72:8001", fallback = RedisServiceFallback.class, configuration = FeignConfiguration.class)
+//@FeignClient(name = "test", url = "http://10.15.12.72:8001",path = "/simulation/resource/common", fallback = FileDownServiceFallback.class, configuration = FeignConfiguration.class)
 @FeignClient(
         contextId = "file",
         value = "simulation-resource-common",
@@ -31,7 +31,7 @@ public interface FileDownService {
 
     @PostMapping(value = "/minio/uploadProcessBar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     ResponseBodyVO<String> uploadProcessBar(@RequestPart("file") MultipartFile file,
-                                  @RequestParam("objectName") String objectName,  @RequestParam("objectName") String objectPath);
+                                  @RequestParam("objectName") String objectName,  @RequestParam("objectPath") String objectPath);
 
     @PostMapping("/minio/download")
     Response download(@RequestBody @Validated MinioParameter minioParameter);