Ver código fonte

实现文件合并接口

lijie 3 anos atrás
pai
commit
d6ec8b5221

+ 21 - 5
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/FileUploadController.java

@@ -1,11 +1,13 @@
 package com.persagy.dmp.file.controller;
 
 import cn.hutool.core.util.StrUtil;
+import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.constant.ValidEnum;
 import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.lang.PsDateTime;
 import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.common.utils.ParamCheckUtil;
 import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.file.domain.FileRequestData;
 import com.persagy.dmp.file.model.FileInfo;
@@ -13,10 +15,7 @@ import com.persagy.dmp.file.service.FileUploadService;
 import com.persagy.dmp.file.service.IFileService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -28,6 +27,7 @@ import java.util.List;
 @RestController
 @RequestMapping("/upload/")
 @RequiredArgsConstructor(onConstructor = @__(@Autowired))
+@CrossOrigin(origins = "*",allowCredentials = "true",methods = {RequestMethod.POST,RequestMethod.GET},maxAge = 3600)
 public class FileUploadController {
 
     private final FileUploadService fileUploadService;
@@ -39,8 +39,24 @@ public class FileUploadController {
      * @date :2021/10/9 20:12
      * Update By lijie 2021/10/9 20:12
      */
-    @PostMapping("/initChunkUpload")
+    @PostMapping("initChunkUpload")
     public CommonResult<List<FileInfo>> initChunkUpload(@RequestBody FileRequestData requestData) {
+        //基础参数校验
+        ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE);
         return ResultHelper.multi(fileUploadService.initChunkUpload(requestData));
     }
+    /***
+     * Description: 初始化大文件上传
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.FileInfo>
+     * @author : lijie
+     * @date :2021/10/9 20:12
+     * Update By lijie 2021/10/9 20:12
+     */
+    @PostMapping("composeFile")
+    public CommonResult<FileInfo> composeFile(@RequestBody FileRequestData requestData) {
+        //基础参数校验
+        ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE);
+        return ResultHelper.single(fileUploadService.composeFile(requestData));
+    }
 }

+ 9 - 0
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/FileUploadService.java

@@ -22,4 +22,13 @@ public interface FileUploadService extends IService<FileInfo> {
      * Update By lijie 2021/10/9 20:27
      */
     List<FileInfo> initChunkUpload(FileRequestData requestData);
+    /***
+     * Description: 合并断点续传的文件
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.file.model.FileInfo
+     * @author : lijie
+     * @date :2021/10/20 21:57
+     * Update By lijie 2021/10/20 21:57
+     */
+    FileInfo composeFile(FileRequestData requestData);
 }

+ 31 - 1
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/FileUploadServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.api.R;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.persagy.dmp.common.constant.ResponseCode;
+import com.persagy.dmp.common.context.AppContext;
 import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
@@ -22,6 +23,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -56,6 +59,8 @@ public class FileUploadServiceImpl extends ServiceImpl<FileMapper, FileInfo> imp
     @Override
     @Transactional(rollbackFor = Exception.class)
     public List<FileInfo> initChunkUpload(FileRequestData requestData) {
+        String groupCode = AppContext.getContext().getGroupCode();
+        requestData.setGroupCode(groupCode);
         if (StrUtil.isBlank(requestData.getFileMd5())){
             throw new BusinessException(ResponseCode.A0400.getCode(), ResponseCode.A0400.getDesc());
         }
@@ -92,6 +97,31 @@ public class FileUploadServiceImpl extends ServiceImpl<FileMapper, FileInfo> imp
         // 4.第一次上传或已存在但没有上传过分片的
         return firstInitChunkUploadInternal(requestData);
     }
+
+    @Override
+    public FileInfo composeFile(FileRequestData requestData) {
+        //根据md5获取所有分片文件名称(minio的文件名称 = 文件path)
+        List<String> chunks = minioCommonService.listObjectNames("chunk",requestData.getFileMd5());
+        //自定义文件名称
+        String fileName = requestData.getFileName();
+        String suffix = fileName.substring(fileName.lastIndexOf("."));
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        fileName = df.format(LocalDateTime.now()) + suffix;
+        //合并文件
+        if(minioCommonService.composeObject(requestData.getBucketName(),chunks,fileName)){
+            //获取文件访问外链(1小时过期)
+            String url = minioCommonService.getObjectUrl(requestData.getBucketName(),fileName,60);
+            //获取数据库里记录的文件信息,修改数据并返回文件信息
+            FileInfo fileInfo = queryFileInfosByFileMd5(requestData.getFileMd5());
+            fileInfo.setUploadStatus(UPLOAD_SUCCESS);
+            fileInfo.setFileName(fileName);
+            fileInfo.setFilePath(url);
+            this.updateById(fileInfo);
+            return fileInfo;
+        }
+        throw new BusinessException(ResponseCode.B0001.getCode(), "合并文件失败");
+    }
+
     /***
      * Description: 初次上传和已有文件信息但未上传任何分片的情况下则直接生成所有上传url 
      * @param requestData : 
@@ -113,7 +143,7 @@ public class FileUploadServiceImpl extends ServiceImpl<FileMapper, FileInfo> imp
             chunkUploadUrls.add(fileInfo);
         }
         //向数据库中记录该文件的上传信息
-        FileInfo fileInfo = FileInfoCreator.of(requestData.getGroupCode(),requestData.getBusinessId(),
+        FileInfo fileInfo = FileInfoCreator.of(AppContext.getContext().getGroupCode(),requestData.getBusinessId(),
                 requestData.getBucketName(), requestData.getFileName());
         fileInfo.setUploadStatus(UPLOAD_PART);
         fileInfo.setFileMd5(requestData.getFileMd5());

+ 10 - 10
dmp-cloud/dmp-file/src/main/resources/bootstrap.yml

@@ -22,13 +22,13 @@ persagy:
       enabled: false
     # minIO文件服务器信息
     file:
-      storage: 2
-#      url: http://192.168.100.102:31345/
-#      accessKey: persagy
-#      secretKey: persagy@2021
-#      minio:
-#        bucket:
-#          chunk: bdtp
-      url: hdfs://node1:8020
-      accessKey: saga
-      secretKey: 12345678
+      storage: 0
+      url: http://192.168.100.102:31345/
+      accessKey: persagy
+      secretKey: persagy@2021
+      minio:
+        bucket:
+          chunk: bdtp
+#      url: hdfs://node1:8020
+#      accessKey: saga
+#      secretKey: 12345678

+ 1 - 0
dmp-cloud/dmp-file/src/main/resources/db/init/data.sql

@@ -0,0 +1 @@
+SELECT 1

+ 20 - 0
dmp-cloud/dmp-file/src/main/resources/db/init/schema.sql

@@ -0,0 +1,20 @@
+CREATE TABLE IF NOT EXISTS `dt_file_info` (
+`id` varchar(40) NOT NULL COMMENT '主键',
+`group_code` varchar(40) NOT NULL COMMENT '集团编码',
+`file_name` varchar(128) NOT NULL COMMENT '文件名称',
+`file_type` varchar(2) NOT NULL DEFAULT '0' COMMENT '文件类型:0-文件,1-目录',
+`file_bucket` varchar(64) NOT NULL DEFAULT '0' COMMENT '文件分组:默认为应用名',
+`file_path` varchar(512) NULL DEFAULT NULL COMMENT '文件路径含文件名称-对应文件存储路径',
+`file_size` int(10) NOT NULL DEFAULT 0 COMMENT '文件大小',
+`file_md5` varchar(64) NULL DEFAULT NULL COMMENT '文件的md5值',
+`upload_status` tinyint NOT NULL DEFAULT 0 COMMENT '文件上传状态,0.上传完成,1.已上传部分',
+`business_id` varchar(32) NULL DEFAULT NULL COMMENT '关联业务Id',
+`expire_date` char(8) NULL DEFAULT NULL COMMENT '保留期限',
+`creator` varchar(32) DEFAULT NULL COMMENT '创建人',
+`creation_time` char(14) NULL DEFAULT NULL COMMENT '创建时间',
+`modifier` varchar(32) DEFAULT NULL COMMENT '最后修改人',
+`modified_time` char(14) NULL DEFAULT NULL COMMENT '最后修改时间',
+`valid` tinyint DEFAULT NULL COMMENT '合法标识',
+`ts` timestamp default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='文件信息';

+ 0 - 20
dmp-cloud/dmp-file/src/main/resources/db/init/table.sql

@@ -1,20 +0,0 @@
-CREATE TABLE IF NOT EXISTS `dt_file_info`(
- `id` varchar(64) NOT NULL COMMENT 'id',
- `group_code` varchar(100) NOT NULL COMMENT '集团编码:租户',
- `file_name` varchar(128) NOT NULL COMMENT '文件名称:显示用',
- `file_type` varchar(2) NOT NULL DEFAULT '0' COMMENT '文件类型:0-文件,1-目录',
- `file_bucket` varchar(64) NOT NULL DEFAULT '0' COMMENT '文件分组:默认为应用名',
- `file_path` varchar(512) NULL DEFAULT NULL COMMENT '文件路径含文件名称-对应文件存储路径',
- `file_size` int(0) NOT NULL DEFAULT 0 COMMENT '文件大小',
- `file_md5` varchar(64) NULL DEFAULT NULL COMMENT '文件的md5值',
- `upload_status` int(0) NOT NULL DEFAULT 0 COMMENT '文件上传状态,0.上传完成,1.已上传部分',
- `business_id` varchar(32) NULL DEFAULT NULL COMMENT '关联业务Id',
- `expire_date` char(8) NULL DEFAULT NULL COMMENT '保留期限',
- `creator` varchar(32) NULL DEFAULT NULL COMMENT '创建人',
- `creation_time` char(14) NULL DEFAULT NULL COMMENT '创建时间',
- `modifier` varchar(32) NULL DEFAULT NULL COMMENT '最后修改人',
- `modified_time` char(14) NULL DEFAULT NULL COMMENT '最后修改时间',
- `valid` int(0) NULL DEFAULT NULL COMMENT '合法标识',
- `ts` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '乐观锁',
- PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '文件信息';