tsurumure 7 месяцев назад
Родитель
Сommit
b94f5dce74

+ 49 - 15
src/main/java/com/backendsys/modules/sdk/douyincloud/tos/service/impl/DouyinTosServiceImpl.java

@@ -1,10 +1,16 @@
 package com.backendsys.modules.sdk.douyincloud.tos.service.impl;
 
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
 import com.backendsys.exception.CustException;
+import com.backendsys.modules.common.config.security.utils.SecurityUtil;
 import com.backendsys.modules.common.utils.CommonUtil;
 import com.backendsys.modules.sdk.douyincloud.tos.service.DouyinTosService;
+import com.backendsys.modules.sdk.tencentcloud.cos.entity.Progress;
+import com.backendsys.modules.sse.entity.SseResponse;
+import com.backendsys.modules.sse.entity.SseResponseEnum;
+import com.backendsys.modules.sse.utils.SseUtil;
 import com.backendsys.modules.upload.entity.SysUploadResult;
 import com.volcengine.tos.TOSV2;
 import com.volcengine.tos.TOSV2ClientBuilder;
@@ -14,26 +20,41 @@ import com.volcengine.tos.comm.event.DataTransferListener;
 import com.volcengine.tos.comm.event.DataTransferStatus;
 import com.volcengine.tos.comm.event.DataTransferType;
 import com.volcengine.tos.model.object.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.math.BigDecimal;
 
 // 对象接口 -> 上传对象
 // https://www.volcengine.com/docs/6349/79898
 @Service
 public class DouyinTosServiceImpl implements DouyinTosService {
 
-    private String REGION = "cn-beijing";
-    private String ENDPOINT = "tos-cn-beijing.volces.com";
-    private String DOMAIN = "https://tt8742f1ff1875cd2201-env-33n84bi3xr.tos-cn-beijing.volces.com";
-    private String BUCKET_NAME = "tt8742f1ff1875cd2201-env-33n84bi3xr";
-    private String ACCESS_KEY_ID = "AKLTNmFiMjBjMTZjZDYxNDlhZmI2OTc2M2U4MWZlODhhNGY";
-    private String SECRET_ACCESS_KEY = "TVRjME9UUmhabUZtWW1JNU5EWXhORGhoWVdJME16Z3pNbUprWkRKa1lqTQ==";
+    @Autowired
+    private SseUtil sseUtil;
+
+    @Value("${spring.application.name}")
+    private String APPLICATION_NAME;
+    @Value("${douyin.tos.region}")
+    private String REGION;
+    @Value("${douyin.tos.endpoint}")
+    private String ENDPOINT;
+    @Value("${douyin.tos.domain}")
+    private String DOMAIN;
+    @Value("${douyin.tos.bucket-name}")
+    private String BUCKET_NAME;
+    @Value("${douyin.tos.access-key-id}")
+    private String ACCESS_KEY_ID;
+    @Value("${douyin.tos.secret-access-key}")
+    private String SECRET_ACCESS_KEY;
 
 
     // [抖音云COS] 获取进度函数
-    private static DataTransferListener getDataTransferListener() {
+    private DataTransferListener getDataTransferListener(String filename) {
+
         return new DataTransferListener() {
             // 自定义实现 DataTransferListener 的 dataTransferStatusChange 接口
             @Override
@@ -42,24 +63,36 @@ public class DouyinTosServiceImpl implements DouyinTosService {
                 long once = dataTransferStatus.getRwOnceBytes();
                 long current = dataTransferStatus.getConsumedBytes();
                 long total = dataTransferStatus.getTotalBytes();
+                String state = "";
+                BigDecimal percentage = Convert.toBigDecimal(0);
 
                 if (dataTransferStatus.getType() == DataTransferType.DATA_TRANSFER_STARTED) {
+                    state = "init";
                     System.out.println("putObject started.");
                 } else if (dataTransferStatus.getType() == DataTransferType.DATA_TRANSFER_RW) {
-
+                    state = "inprogress";
                     // 计算百分比
-                    double percentage = NumberUtil.mul(current, 100) / total;
+                    percentage = NumberUtil.round(NumberUtil.mul(current, 100) / total, 2);
                     System.out.printf("putObject progress: [%d / %d] = %.02f%% \n", current, total, percentage);
-
-//                    System.out.printf("putObject, send %d bytes once, has sent %d bytes, total %d bytes.\n",
-//                            dataTransferStatus.getRwOnceBytes(), dataTransferStatus.getConsumedBytes(),
-//                            dataTransferStatus.getTotalBytes());
-
                 } else if (dataTransferStatus.getType() == DataTransferType.DATA_TRANSFER_FAILED) {
+                    state = "completed";
                     System.out.printf("putObject failed, has sent %d bytes, total %d bytes.\n", dataTransferStatus.getConsumedBytes(), total);
                 } else if (dataTransferStatus.getType() == DataTransferType.DATA_TRANSFER_SUCCEED) {
+                    state = "completed";
                     System.out.printf("putObject succeed, has sent %d bytes, total %d bytes.\n", dataTransferStatus.getConsumedBytes(), total);
                 }
+
+                // [SSE] 进度回传
+                Progress progress = new Progress();
+                progress.setFilename(filename);
+                progress.setCurrent(current);
+                progress.setTotal(total);
+                progress.setPercent(percentage);
+                progress.setState(state);
+                String dataStr = (new SseResponse(SseResponseEnum.UPLOAD, progress)).toJsonStr();
+                String emitterKey = APPLICATION_NAME + "-userid-" + Convert.toStr(SecurityUtil.getUserId());
+                sseUtil.send(emitterKey, dataStr);
+
             }
         };
     }
@@ -97,8 +130,9 @@ public class DouyinTosServiceImpl implements DouyinTosService {
             // 在 ObjectMetaRequestOptions 中设置文件大小,可在进度条中显示 total 总长度,否则 DataTransferStatus.getTotalBytes 值为 -1。
             ObjectMetaRequestOptions options = new ObjectMetaRequestOptions().setContentLength(multipartFile.getSize());
             putObjectInput.setOptions(options);
+
             // 自定义实现 DataTransferListener,实现进度条功能
-            DataTransferListener listener = getDataTransferListener();
+            DataTransferListener listener = getDataTransferListener(filename);
             putObjectInput.setDataTransferListener(listener);
 
             // 上传对象

+ 3 - 4
src/main/java/com/backendsys/modules/sdk/tencentcloud/cos/entity/Progress.java

@@ -4,12 +4,12 @@ import cn.hutool.json.JSONUtil;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 public class Progress {
 
     private String state;
-//    @JsonInclude(JsonInclude.Include.NON_NULL)
-//    private ProgressData data;
 
     @JsonInclude(JsonInclude.Include.NON_NULL)
     private String filename;
@@ -17,8 +17,7 @@ public class Progress {
     private Long current;
     @JsonInclude(JsonInclude.Include.NON_NULL)
     private Long total;
-    @JsonInclude(JsonInclude.Include.NON_NULL)
-    private Double percent;
+    private BigDecimal percent;
 
     public String toJsonStr() {
         return JSONUtil.toJsonStr(this);

+ 0 - 11
src/main/java/com/backendsys/modules/sdk/tencentcloud/cos/entity/ProgressData.java

@@ -1,11 +0,0 @@
-package com.backendsys.modules.sdk.tencentcloud.cos.entity;
-
-import lombok.Data;
-
-@Data
-public class ProgressData {
-    private String filename;
-    private Long current;
-    private Long total;
-    private Double percent;
-}

+ 6 - 8
src/main/java/com/backendsys/modules/sdk/tencentcloud/cos/service/impl/TencentCosServiceImpl.java

@@ -1,13 +1,13 @@
 package com.backendsys.modules.sdk.tencentcloud.cos.service.impl;
 
 import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
 import com.backendsys.exception.CustException;
 import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
 import com.backendsys.modules.common.config.security.utils.SecurityUtil;
 import com.backendsys.modules.common.utils.CommonUtil;
 import com.backendsys.modules.sdk.tencentcloud.cos.entity.Progress;
-import com.backendsys.modules.sdk.tencentcloud.cos.entity.ProgressData;
 import com.backendsys.modules.sdk.tencentcloud.cos.service.TencentCosService;
 import com.backendsys.modules.sdk.tencentcloud.cos.utils.TencentCosUtil;
 import com.backendsys.modules.sse.entity.SseResponse;
@@ -34,6 +34,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
+import java.math.BigDecimal;
 import java.net.URL;
 import java.util.Date;
 import java.util.LinkedList;
@@ -46,12 +47,9 @@ import java.util.List;
 @Service
 public class TencentCosServiceImpl implements TencentCosService {
 
-    @Autowired
-    private HttpRequestUtil httpRequestUtil;
     @Autowired
     private SseUtil sseUtil;
 
-
     @Value("${spring.application.name}")
     private String APPLICATION_NAME;
     @Value("${tencent.cos.max-size}")
@@ -67,6 +65,7 @@ public class TencentCosServiceImpl implements TencentCosService {
     @Value("${tencent.cos.secret-key}")
     private String SECRET_KEY;
 
+
     // [腾讯云COS] 生成cos客户端
     private COSClient getClient() {
         COSCredentials cred = new BasicCOSCredentials(SECRET_ID, SECRET_KEY);
@@ -81,11 +80,11 @@ public class TencentCosServiceImpl implements TencentCosService {
     // [腾讯云COS][高级接口] 获取进度函数
     private void showTransferProgress(String filename, Transfer transfer) {
 
-        String emitterKey = APPLICATION_NAME + "-userid-" + Convert.toStr(SecurityUtil.getUserId());
-
         // [SSE] 进度回传
         Progress progress = new Progress();
         progress.setState("init");
+        progress.setFilename(filename);
+        String emitterKey = APPLICATION_NAME + "-userid-" + Convert.toStr(SecurityUtil.getUserId());
         sseUtil.send(emitterKey, (new SseResponse(SseResponseEnum.UPLOAD, progress)).toJsonStr());
 
         // 查询上传是否已经完成
@@ -96,12 +95,11 @@ public class TencentCosServiceImpl implements TencentCosService {
             TransferProgress transferProgress = transfer.getProgress();
             long current = transferProgress.getBytesTransferred();
             long total = transferProgress.getTotalBytesToTransfer();
-            double percent = transferProgress.getPercentTransferred();
+            BigDecimal percent = NumberUtil.round(transferProgress.getPercentTransferred(), 2);
             String state = Convert.toStr(transfer.getState());
             System.out.printf("Upload progress: [%d / %d] = %.02f%% (%s)\n", current, total, percent, state);
 
             // [SSE] 进度回传
-            progress.setFilename(filename);
             progress.setCurrent(current);
             progress.setTotal(total);
             progress.setPercent(percent);

+ 10 - 3
src/main/resources/application-local.yml

@@ -114,7 +114,7 @@ tencent:
     secret-key: IXgzFKB71rXOCxlS4BTdtCYuJbP8h7Xr
   cos:
     # 上传的最大大小限制 (5MB = 5242880) (1GB = 1073741824)
-    max-size: 5242880
+    max-size: 5242880 # (即将删除)
     # ------------------------------------------------------
     secret-id: AKID3zlNxRjstjnohWFnDUfeVBj3CJH7mFaK
     secret-key: IXgzFKB71rXOCxlS4BTdtCYuJbP8h7Xr
@@ -122,12 +122,10 @@ tencent:
     secret-id-temp: AKIDVuCIAoKiuzyqV1hIo8HEJtKcm8NWXkx4
     secret-key-temp: 763nQwV0JPQDsLYeeaWL4atMhvynaGjy
     # ------------------------------------------------------
-
     # 香港
     region: ap-hongkong
     bucket-name: storage-1320301544
     accessible-domain: http://cos.daoguyujiamcn.com
-
 #    # 广州
 #    region: ap-guangzhou
 #    bucket-name: duanju3-1320301544
@@ -148,6 +146,15 @@ tencent:
     app-key: 9d66c73a8a694333b5244447edd62576              # 测试账号 yuyangtest01 (账号 -> 数智人平台 -> 资产管理)
     access-token: c47f22402e7c43818b254ef116dc7787
 
+# 抖音云
+douyin:
+  tos:
+    region: cn-beijing
+    endpoint: tos-cn-beijing.volces.com
+    domain: https://tt8742f1ff1875cd2201-env-33n84bi3xr.tos-cn-beijing.volces.com
+    bucket-name: tt8742f1ff1875cd2201-env-33n84bi3xr
+    access-key-id: AKLTNmFiMjBjMTZjZDYxNDlhZmI2OTc2M2U4MWZlODhhNGY
+    secret-access-key: TVRjME9UUmhabUZtWW1JNU5EWXhORGhoWVdJME16Z3pNbUprWkRKa1lqTQ==
 
 baidu:
   ai:

+ 10 - 1
src/main/resources/application-prod.yml

@@ -116,7 +116,7 @@ tencent:
     secret-key: IXgzFKB71rXOCxlS4BTdtCYuJbP8h7Xr
   cos:
     # 上传的最大大小限制 (5MB = 5242880) (1GB = 1073741824)
-    max-size: 5242880
+    max-size: 5242880 # (即将删除)
     # ------------------------------------------------------
     secret-id: AKID3zlNxRjstjnohWFnDUfeVBj3CJH7mFaK
     secret-key: IXgzFKB71rXOCxlS4BTdtCYuJbP8h7Xr
@@ -138,6 +138,15 @@ tencent:
     app-key: 9d66c73a8a694333b5244447edd62576              # 测试账号 yuyangtest01 (账号 -> 数智人平台 -> 资产管理)
     access-token: c47f22402e7c43818b254ef116dc7787
 
+# 抖音云
+douyin:
+  tos:
+    region: cn-beijing
+    endpoint: tos-cn-beijing.volces.com
+    domain: https://tt8742f1ff1875cd2201-env-33n84bi3xr.tos-cn-beijing.volces.com
+    bucket-name: tt8742f1ff1875cd2201-env-33n84bi3xr
+    access-key-id: AKLTNmFiMjBjMTZjZDYxNDlhZmI2OTc2M2U4MWZlODhhNGY
+    secret-access-key: TVRjME9UUmhabUZtWW1JNU5EWXhORGhoWVdJME16Z3pNbUprWkRKa1lqTQ==
 
 baidu:
   ai: