Bläddra i källkod

初始化分块加入md5

tsurumure 3 månader sedan
förälder
incheckning
635c4b1b27

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

@@ -3,6 +3,7 @@ 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 cn.hutool.crypto.digest.DigestUtil;
 import cn.hutool.http.HttpUtil;
 import com.backendsys.exception.CustException;
 import com.backendsys.modules.common.config.security.utils.SecurityUtil;

+ 37 - 36
src/main/java/com/backendsys/modules/upload/service/impl/SysFileMultipartServiceImpl.java

@@ -98,7 +98,7 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
     }
 
     // [方法] 上传事件
-    private SysFile uploadInitEvent(MultipartFile multipartFile, Long category_id, Integer target, Integer upload_chunk_count) {
+    private SysFile uploadInitEvent(MultipartFile multipartFile, Long category_id, Integer target, Integer upload_chunk_count, String md5) {
         System.out.println("[系统配置] 上传目标(-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云): " + target);
 
         String filename = multipartFile.getOriginalFilename();
@@ -139,6 +139,7 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
         sysFileEntity.setTarget(target);
         sysFileEntity.setContent_type(multipartFile.getContentType());
         sysFileEntity.setSize(multipartFile.getSize());
+        sysFileEntity.setMd5(md5);
         sysFileDao.insert(sysFileEntity);
 
         return sysFileEntity;
@@ -166,17 +167,19 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
             if (sysCommon.getTag().equals("UPLOAD_MD5_DUPLICATE")) UPLOAD_MD5_DUPLICATE.set(Convert.toBool(sysCommon.getValue()));
         });
 
+        try {
 
-        // 如果开启了 MD5秒传,则判断文件是否上传过,是的话就直接返回
-        // [系统配置] 是否启用文件MD5查重 (仅判断用户自己上传过的文件)
-        // - 存在,则根据文件MD5 判断是否上传过文件 (仅更新时间,不上传已存在的文件,允许更新文件分类)
-        // - 存在,如果存在两个相同 md5 以上的文件,则需要排重后再上传 (如果是不同用户
-        // - 不存在,则走上传流程
-        Boolean is_exist = false;
-        SysFile sysFileEntity = null;
-        if (UPLOAD_MD5_DUPLICATE.get()) {
-            try {
-                String md5 = DigestUtil.md5Hex(multipartFile.getInputStream());
+            SysFile sysFileEntity = null;
+
+            String md5 = DigestUtil.md5Hex(multipartFile.getInputStream());
+
+            // 如果开启了 MD5秒传,则判断文件是否上传过,是的话就直接返回
+            // [系统配置] 是否启用文件MD5查重 (仅判断用户自己上传过的文件)
+            // - 存在,则根据文件MD5 判断是否上传过文件 (仅更新时间,不上传已存在的文件,允许更新文件分类)
+            // - 存在,如果存在两个相同 md5 以上的文件,则需要排重后再上传 (如果是不同用户
+            // - 不存在,则走上传流程
+            Boolean is_exist = false;
+            if (UPLOAD_MD5_DUPLICATE.get()) {
 
                 // 排除文件异常的情况(出现两个以上相同MD5的文件)
                 LambdaQueryWrapper<SysFile> wrapperFile = new LambdaQueryWrapper<>();
@@ -191,44 +194,42 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
                 }
 
                 if (sysFileEntityList != null && sysFileEntityList.size() > 0) {
-
                     is_exist = true;
                     // 将已存在的文件,赋值
                     sysFileEntity = sysFileEntityList.get(0);
                     // [DB] 更新文件 (文件分类、上传时间)
                     sysFileEntity.setCategory_id(category_id);
                     sysFileEntity.setUpload_time(DateUtil.now());
-
                     sysFileDao.updateById(sysFileEntity);
                 } else {
                     // [DB] 创建新的文件
-                    sysFileEntity = uploadInitEvent(multipartFile, category_id, UPLOAD_TARGET.get(), upload_chunk_count);
+                    sysFileEntity = uploadInitEvent(multipartFile, category_id, UPLOAD_TARGET.get(), upload_chunk_count, md5);
                     // [格式化] 封面 (图片类型)
                     sysFileEntity = setThumbUrl(sysFileEntity, UPLOAD_THUMB_SIZE.get(), UPLOAD_THUMB_SIZE.get(), StyleEnums.THUMB_BACKGROUND.getValue());
                 }
 
-            } catch (IOException e) {
-                throw new RuntimeException(e);
+            } else {
+                // 不开启 MD5秒 传,则直接初始化分块
+                // [DB] 创建新的文件
+                sysFileEntity = uploadInitEvent(multipartFile, category_id, UPLOAD_TARGET.get(), upload_chunk_count, md5);
+                // [格式化] 封面 (图片类型)
+                sysFileEntity = setThumbUrl(sysFileEntity, UPLOAD_THUMB_SIZE.get(), UPLOAD_THUMB_SIZE.get(), StyleEnums.THUMB_BACKGROUND.getValue());
             }
-        } else {
-            // 不开启 MD5秒 传,则直接初始化分块
-            // [DB] 创建新的文件
-            sysFileEntity = uploadInitEvent(multipartFile, category_id, UPLOAD_TARGET.get(), upload_chunk_count);
-            // [格式化] 封面 (图片类型)
-            sysFileEntity = setThumbUrl(sysFileEntity, UPLOAD_THUMB_SIZE.get(), UPLOAD_THUMB_SIZE.get(), StyleEnums.THUMB_BACKGROUND.getValue());
-        }
 
-        Map<String, Object> resp = new LinkedHashMap<>();
-        resp.put("target", UPLOAD_TARGET.get());
-        resp.put("target_label", StyleEnums.targetToLabel(UPLOAD_TARGET.get()));
-        resp.put("upload_chunk_count", upload_chunk_count);
-        resp.put("upload_id", sysFileEntity.getUpload_id());
-        resp.put("object_key", sysFileEntity.getObject_key());
-        // MD5 秒传,返回已上传的文件信息
-        resp.put("is_exist", is_exist);
-        resp.put("file_info", is_exist ? sysFileEntity : null);
-        return resp;
+            Map<String, Object> resp = new LinkedHashMap<>();
+            resp.put("target", UPLOAD_TARGET.get());
+            resp.put("target_label", StyleEnums.targetToLabel(UPLOAD_TARGET.get()));
+            resp.put("upload_chunk_count", upload_chunk_count);
+            resp.put("upload_id", sysFileEntity.getUpload_id());
+            resp.put("object_key", sysFileEntity.getObject_key());
+            resp.put("md5", md5);
+            resp.put("is_exist", is_exist);
+            resp.put("file_info", is_exist ? sysFileEntity : null);
+            return resp;
 
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
     }
 
     // 2.上传分块
@@ -251,12 +252,12 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
             String object_key = sysFileEntity.getObject_key();
             Integer upload_chunk_size = sysFileEntity.getUpload_chunk_count();
             if (upload_chunk_index > upload_chunk_size) throw new CustException("分块索引(index)不能大于分块数量(count)");
+            if (upload_chunk_index == upload_chunk_size) throw new CustException("分块索引(index)等于分块数量(count),请调用合并接口");
 
+            // 进入分块上传流程
             if (upload_chunk_index < upload_chunk_size) {
                 // 分片编号从 1 开始,最大为 10000。除最后一个分片以外,其他分片大小最小为 4MiB
-                if (multipartFile.getSize() < 4 * 1024 * 1024) {
-                    throw new CustException("分块文件大小不能小于 4MB");
-                }
+                if (multipartFile.getSize() < 4 * 1024 * 1024) throw new CustException("分块文件大小不能小于 4MB");
             }
 
             // 获得公共配置