tsurumure 8 ay önce
ebeveyn
işleme
ecd0de9ede

+ 2 - 1
db/sys_upload.sql

@@ -11,7 +11,8 @@ CREATE TABLE `sys_upload` (
     `category_id` BIGINT(10) COMMENT '分类ID',
     `user_id` BIGINT(10) COMMENT '上传用户ID',
     `name` VARCHAR(255) NOT NULL COMMENT '文件名称',
-    `full_path` VARCHAR(1000) COMMENT '文件完整路径',
+    `content_type` VARCHAR(255) NOT NULL COMMENT '文件类型',
+    `url` VARCHAR(1000) COMMENT 'URL',
     `object_key` VARCHAR(500) COMMENT 'ObjectKey',
     `size` INT COMMENT '文件大小',
     `md5` VARCHAR(255) COMMENT '文件MD5',

+ 17 - 0
src/main/java/com/backendsys/modules/common/utils/CommonUtil.java

@@ -0,0 +1,17 @@
+package com.backendsys.modules.common.utils;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.lang.UUID;
+import org.springframework.web.multipart.MultipartFile;
+
+
+public class CommonUtil {
+
+    // [文件] 生成新的文件名 (UUID + 后缀名)
+    public static String generateUUIDFilename(MultipartFile multipartFile) {
+        String originalFileName = multipartFile.getOriginalFilename();
+        String suffix = originalFileName.substring(originalFileName.lastIndexOf("."));
+        return Convert.toStr(UUID.randomUUID()) + suffix;
+    }
+
+}

+ 2 - 3
src/main/java/com/backendsys/modules/sdk/tencent/cos/entity/Progress.java

@@ -4,7 +4,6 @@ import lombok.Data;
 
 @Data
 public class Progress {
-    private Long current;
-    private Long total;
-    private Double percent;
+    private String state;
+    private ProgressData data;
 }

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

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

+ 26 - 21
src/main/java/com/backendsys/modules/sdk/tencent/cos/service/impl/TencentCosServiceImpl.java

@@ -1,5 +1,6 @@
 package com.backendsys.modules.sdk.tencent.cos.service.impl;
 
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.digest.DigestUtil;
@@ -8,11 +9,12 @@ import com.backendsys.entity.System.SysFile.SysFileDTO;
 import com.backendsys.entity.Tencent.TencentCos.MultipartUploadRespDTO;
 import com.backendsys.exception.CustException;
 import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
+import com.backendsys.modules.common.utils.CommonUtil;
 import com.backendsys.modules.sdk.tencent.cos.entity.Progress;
+import com.backendsys.modules.sdk.tencent.cos.entity.ProgressData;
 import com.backendsys.modules.sdk.tencent.cos.service.TencentCosService;
 import com.backendsys.modules.sdk.tencent.cos.utils.TencentCosUtil;
 import com.backendsys.modules.sse.utils.SseUtil;
-import com.backendsys.utils.CommonUtil;
 import com.qcloud.cos.COSClient;
 import com.qcloud.cos.ClientConfig;
 import com.qcloud.cos.auth.BasicCOSCredentials;
@@ -76,12 +78,14 @@ public class TencentCosServiceImpl implements TencentCosService {
     }
 
     // [腾讯云COS][高级接口] 获取进度函数
-    private void showTransferProgress(String md5, Transfer transfer) {
-        // 这里的 Transfer 是异步上传结果 Upload 的父类
-        System.out.println(transfer.getDescription());
+    private void showTransferProgress(String filename, Transfer transfer) {
+
+        Progress progress = new Progress();
+        progress.setState("Init");
+        sseUtil.send(httpRequestUtil.getUserId(), progress);
+
         // 查询上传是否已经完成
         while (transfer.isDone() == false) {
-
             // 每秒获取一次进度
             try { Thread.sleep(1000); } catch (InterruptedException e) { return; }
 
@@ -89,20 +93,24 @@ public class TencentCosServiceImpl implements TencentCosService {
             long current = transferProgress.getBytesTransferred();
             long total = transferProgress.getTotalBytesToTransfer();
             double percent = transferProgress.getPercentTransferred();
-            System.out.printf("upload Progress: [%d / %d] = %.02f%%\n", current, total, percent);
+            String state = Convert.toStr(transfer.getState());
+            System.out.printf("Upload progress: [%d / %d] = %.02f%% (%s)\n", current, total, percent, state);
 
-            Progress progress = new Progress();
-            progress.setCurrent(current);
-            progress.setTotal(total);
-            progress.setPercent(percent);
-            sseUtil.send(httpRequestUtil.getUserId(), progress);
+            ProgressData progressData = new ProgressData();
+            progressData.setFilename(filename);
+            progressData.setCurrent(current);
+            progressData.setTotal(total);
+            progressData.setPercent(percent);
 
+            progress.setState(state);
+            progress.setData(progressData);
+            sseUtil.send(httpRequestUtil.getUserId(), progress);
+            // System.out.println(transfer.getState());    // state: (完成 Completed, 失败 Failed)
         }
-        // 完成了 Completed,或者失败了 Failed
-        System.out.println(transfer.getState());
-        sseUtil.send(httpRequestUtil.getUserId(), transfer.getState());
+
     }
 
+
     // [腾讯云COS] 上传对象
     @Override
     public UploadResult putObject(MultipartFile multipartFile, String object_key) {
@@ -113,15 +121,12 @@ public class TencentCosServiceImpl implements TencentCosService {
         try {
 
             // 如果不传 object_key,则默认使用临时文件夹 (/temp) + MD5文件名
-            String md5 = DigestUtil.md5Hex(multipartFile.getInputStream());
+
+            String filename = CommonUtil.generateUUIDFilename(multipartFile);
             if (StrUtil.isEmpty(object_key)) {
-                String suffix = FileUtil.extName(multipartFile.getOriginalFilename()).toLowerCase();
-                String filename = md5 + "." + suffix;
                 object_key = "temp/" + filename;
             }
-
-            URL url = generateUrl(object_key, 15);
-            System.out.println("url = " + url);
+            System.out.println("Upload object: " + object_key);
 
             // 创建 PutObjectRequest 对象,PutObject 请求。(异步)
             ObjectMetadata metadata = new ObjectMetadata();
@@ -134,7 +139,7 @@ public class TencentCosServiceImpl implements TencentCosService {
             // 高级上传
             TransferManager transferManager = TencentCosUtil.createTransferManager(cosClient);
             Upload upload = transferManager.upload(putObjectRequest);   // 返回一个异步结果Upload
-            showTransferProgress(md5, upload);                          // 查询上传进度,直到上传结束
+            showTransferProgress(filename, upload);                          // 查询上传进度,直到上传结束
             UploadResult uploadResult = upload.waitForUploadResult();   // 捕获可能出现的异常
             return uploadResult;
 

+ 2 - 1
src/main/java/com/backendsys/modules/upload/entity/SysUpload.java

@@ -13,7 +13,8 @@ public class SysUpload {
     private Long category_id;
     private Long user_id;
     private String name;
-    private String full_path;
+    private String content_type;
+    private String url;
     private String object_key;
     private Long size;
     private String md5;

+ 8 - 5
src/main/java/com/backendsys/modules/upload/service/impl/SysUploadServiceImpl.java

@@ -2,6 +2,7 @@ package com.backendsys.modules.upload.service.impl;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.file.FileNameUtil;
+import cn.hutool.crypto.digest.DigestUtil;
 import com.backendsys.exception.CustException;
 import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
 import com.backendsys.modules.sdk.tencent.cos.service.TencentCosService;
@@ -47,21 +48,23 @@ public class SysUploadServiceImpl implements SysUploadService {
                 throw new CustException("上传文件不能大于 " + MAX_SIZE / 1024 / 1024 + " MB,请使用大文件上传功能");
             }
 
-            UploadResult uploadResult = tencentCosService.putObject(multipartFile, null);
-
-            SysUpload sysUploadEntity = sysUploadDao.selectOne(new LambdaQueryWrapper<SysUpload>().eq(SysUpload::getMd5, uploadResult.getETag()));
+            // 根据文件MD5 判断是否上传过文件 (如果上传过,则仅更新记录,不再上传文件)
+            String md5 = DigestUtil.md5Hex(multipartFile.getInputStream());
+            SysUpload sysUploadEntity = sysUploadDao.selectOne(new LambdaQueryWrapper<SysUpload>().eq(SysUpload::getMd5, md5));
             if (sysUploadEntity == null) {
+                UploadResult uploadResult = tencentCosService.putObject(multipartFile, null);
                 // [新增] 上传文件记录
                 sysUploadEntity = new SysUpload();
                 sysUploadEntity.setUser_id(httpRequestUtil.getUserId());
                 sysUploadEntity.setObject_key(uploadResult.getKey());
                 sysUploadEntity.setName(FileNameUtil.getName(uploadResult.getKey()));
-                sysUploadEntity.setFull_path(ACCESSIBLE_DOMAIN + "/" + uploadResult.getKey());
+                sysUploadEntity.setContent_type(multipartFile.getContentType());
+                sysUploadEntity.setUrl(ACCESSIBLE_DOMAIN + "/" + uploadResult.getKey());
                 sysUploadEntity.setSize(multipartFile.getSize());
                 sysUploadEntity.setMd5(uploadResult.getETag());
-                sysUploadDao.insert(sysUploadEntity);
                 sysUploadEntity.setCreate_time(DateUtil.now());
                 sysUploadEntity.setUpdate_time(DateUtil.now());
+                sysUploadDao.insert(sysUploadEntity);
             } else {
                 // [更新] 上传文件记录
                 sysUploadEntity.setUpdate_time(DateUtil.now());