Преглед изворни кода

初始化分块加入md5参数

tsurumure пре 3 месеци
родитељ
комит
c405fd20b3

+ 2 - 2
src/main/java/com/backendsys/modules/upload/controller/SysFileMultipartController.java

@@ -34,8 +34,8 @@ public class SysFileMultipartController {
     @Operation(summary = "初始化分块上传")
     @PreAuthorize("@sr.hasPermission(1.1)")
     @PostMapping("/api/upload/multipartUploadInit")
-    public Result multipartUploadInit(@RequestParam("file") MultipartFile multipartFile, Long category_id, Integer upload_chunk_count) {
-        return Result.success().put("data", sysFileMultipartService.multipartUploadInit(multipartFile, category_id, upload_chunk_count));
+    public Result multipartUploadInit(@RequestParam("file") MultipartFile multipartFile, Long category_id, Integer upload_chunk_count, String md5) {
+        return Result.success().put("data", sysFileMultipartService.multipartUploadInit(multipartFile, category_id, upload_chunk_count, md5));
     }
 
     @SysLog("上传分块")

+ 1 - 1
src/main/java/com/backendsys/modules/upload/service/SysFileMultipartService.java

@@ -9,7 +9,7 @@ import java.util.Map;
 public interface SysFileMultipartService {
 
     // 1.初始化分块上传
-    Map<String, Object> multipartUploadInit(MultipartFile multipartFile, Long category_id, Integer upload_chunk_count);
+    Map<String, Object> multipartUploadInit(MultipartFile multipartFile, Long category_id, Integer upload_chunk_count, String md5);
     // 2.上传分块
     Map<String, Object> multipartUpload(MultipartFile multipartFile, String upload_id, Integer upload_chunk_index);
     // 3.完成分块上传

+ 69 - 73
src/main/java/com/backendsys/modules/upload/service/impl/SysFileMultipartServiceImpl.java

@@ -148,10 +148,11 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
 
     // 1.初始化分块上传 (获得 upload_id, object_key)
     @Override
-    public Map<String, Object> multipartUploadInit(MultipartFile multipartFile, Long category_id, Integer upload_chunk_count) {
+    public Map<String, Object> multipartUploadInit(MultipartFile multipartFile, Long category_id, Integer upload_chunk_count, String md5) {
 
         if (multipartFile.isEmpty()) throw new CustException("file 上传文件不能为空");
         if (upload_chunk_count == null) throw new CustException("upload_chunk_count 分块数量不能为空");
+        if (md5.isEmpty()) throw new CustException("md5 不能为空");
 
         String filename = multipartFile.getOriginalFilename();
         if (filename.length() > 50) throw new CustException("文件名长度不能超过 50 字符");
@@ -160,81 +161,76 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
 //        RLock lock = redissonClient.getLock("lock::multipart-upload::user-id::" + SecurityUtil.getUserId());
 //        try { lock.tryLock(3, TimeUnit.SECONDS);
 
-            // 获得公共配置
-            List<SysCommon> sysCommonList = sysCommonService.getCommonByCategory("UPLOAD");
-            AtomicReference<Integer> UPLOAD_TARGET = new AtomicReference<>();
-            AtomicReference<Integer> UPLOAD_THUMB_SIZE = new AtomicReference<>();
-            AtomicReference<Boolean> UPLOAD_MD5_DUPLICATE = new AtomicReference<>();
-            sysCommonList.stream().forEach(sysCommon -> {
-                if (sysCommon.getTag().equals("UPLOAD_TARGET")) UPLOAD_TARGET.set(Convert.toInt(sysCommon.getValue()));
-                if (sysCommon.getTag().equals("UPLOAD_THUMB_SIZE")) UPLOAD_THUMB_SIZE.set(Convert.toInt(sysCommon.getValue()));
-                if (sysCommon.getTag().equals("UPLOAD_MD5_DUPLICATE")) UPLOAD_MD5_DUPLICATE.set(Convert.toBool(sysCommon.getValue()));
-            });
-
-            try {
-
-                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<>();
-                    wrapperFile.eq(SysFile::getMd5, md5);
-                    wrapperFile.eq(SysFile::getUser_id, SecurityUtil.getUserId());
-
-                    // [DB] 查询已存在的文件分块记录 (只有完全上传成功,才会有 MD5)
-                    // - 异常情况:如果有两个相同的文件,一个上传50%,一个上传成功,就会出现以下这种情况,需要手动解决
-                    List<SysFile> sysFileEntityList = sysFileDao.selectList(wrapperFile);
-                    if (sysFileEntityList != null && sysFileEntityList.size() > 1) {
-                        throw new CustException("存在 " + sysFileEntityList.size() + " 个相同MD5 (" + md5 + ") 的文件,请删除后再重新上传");
-                    }
-
-                    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, 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, md5);
-                    // [格式化] 封面 (图片类型)
-                    sysFileEntity = setThumbUrl(sysFileEntity, UPLOAD_THUMB_SIZE.get(), UPLOAD_THUMB_SIZE.get(), StyleEnums.THUMB_BACKGROUND.getValue());
-                }
+        // 获得公共配置
+        List<SysCommon> sysCommonList = sysCommonService.getCommonByCategory("UPLOAD");
+        AtomicReference<Integer> UPLOAD_TARGET = new AtomicReference<>();
+        AtomicReference<Integer> UPLOAD_THUMB_SIZE = new AtomicReference<>();
+        AtomicReference<Boolean> UPLOAD_MD5_DUPLICATE = new AtomicReference<>();
+        sysCommonList.stream().forEach(sysCommon -> {
+            if (sysCommon.getTag().equals("UPLOAD_TARGET")) UPLOAD_TARGET.set(Convert.toInt(sysCommon.getValue()));
+            if (sysCommon.getTag().equals("UPLOAD_THUMB_SIZE")) UPLOAD_THUMB_SIZE.set(Convert.toInt(sysCommon.getValue()));
+            if (sysCommon.getTag().equals("UPLOAD_MD5_DUPLICATE")) UPLOAD_MD5_DUPLICATE.set(Convert.toBool(sysCommon.getValue()));
+        });
+
+        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<>();
+            wrapperFile.eq(SysFile::getMd5, md5);
+            wrapperFile.eq(SysFile::getUser_id, SecurityUtil.getUserId());
+
+            // [DB] 查询已存在的文件分块记录 (只有完全上传成功,才会有 MD5)
+            // - 异常情况:如果有两个相同的文件,一个上传50%,一个上传成功,就会出现以下这种情况,需要手动解决
+            List<SysFile> sysFileEntityList = sysFileDao.selectList(wrapperFile);
+            if (sysFileEntityList != null && sysFileEntityList.size() > 1) {
+                throw new CustException("存在 " + sysFileEntityList.size() + " 个相同MD5 (" + md5 + ") 的文件,请删除后再重新上传");
+            }
 
-                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);
+            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, 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, md5);
+            // [格式化] 封面 (图片类型)
+            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());
+        resp.put("md5", md5);
+        resp.put("is_exist", is_exist);
+        resp.put("file_info", is_exist ? sysFileEntity : null);
+        return resp;
+
 //        } catch (InterruptedException e) { throw new RuntimeException(e);
 //        } finally { lock.unlock(); }
     }