Parcourir la source

获得专利附图的guid

lwhhszx il y a 1 an
Parent
commit
40b3860268

+ 1 - 0
src/main/java/com/example/fms/common/core/base/RedisConf.java

@@ -20,4 +20,5 @@ public class RedisConf {
     public final static String FIELD_ORDER = "field-order";
     public final static String USER_IMPORT = "user-import";
     public final static String OSS_PART_TAG="oss-part-tag";
+    public final static String TEM_FILE_MESSAGE="tem_file_message";
 }

+ 12 - 0
src/main/java/com/example/fms/common/model/dto/UploadChuckDTO.java

@@ -0,0 +1,12 @@
+package com.example.fms.common.model.dto;
+
+import lombok.Data;
+
+@Data
+public class UploadChuckDTO {
+
+    private String fileName;
+    private Long fileLength;
+    private Integer totalNum;
+    private String md5;
+}

+ 12 - 0
src/main/java/com/example/fms/common/model/vo/UploadChuckVO.java

@@ -0,0 +1,12 @@
+package com.example.fms.common.model.vo;
+
+import lombok.Data;
+
+@Data
+public class UploadChuckVO {
+    private String fileName;
+    private Long fileLength;
+    private Integer totalNum;
+    private String orginName;
+    private String exrName;
+}

+ 20 - 1
src/main/java/com/example/fms/common/utils/FileUtils.java

@@ -69,7 +69,7 @@ public class FileUtils {
         return fileDTO;
     }
 
-    public SystemFileDTO getFileInfo(MultipartFile file){
+    public SystemFileDTO getFileInfo(MultipartFile file) {
         SystemFileDTO systemFileDTO = new SystemFileDTO();
         //以下操作为 先取得传入文件的完整文件名 (文件名 + 后缀) 然后用FileUtil分别取出 文件名 和 不带 "." 的后缀 然后将这些内容装配进 实体中
         //file.getOriginFilename 获取源文件
@@ -283,6 +283,7 @@ public class FileUtils {
         String jsonStr = sb.toString();
         return jsonStr;
     }
+
     public static File multipartFileToFile(MultipartFile file) throws Exception {
         File toFile = null;
         if (file.equals("") || file.getSize() <= 0) {
@@ -317,6 +318,10 @@ public class FileUtils {
         return DateUtils.getNowTimeFormat("yyyyMMdd");
     }
 
+    public static String getDateDirectoryName() {
+        return DateUtils.getNowTimeFormat("yyyyMMdd");
+    }
+
     public static boolean deleteQuietly(final File file) {
         if (file == null) {
             return false;
@@ -409,5 +414,19 @@ public class FileUtils {
         return Files.isSymbolicLink(file.toPath());
     }
 
+    public static String getFileExrName(String fileName) {
+        if (fileName == null || fileName.trim().equals("")) {
+            return "";
+        }
+        String exrName = fileName.substring(fileName.indexOf("."), fileName.length());
+        return exrName;
+    }
+
+    public static String getFilePath(String path) {
+        String directoryName = FileUtils.getDateDirectoryName();
+        String rePath = path + directoryName;
+        return rePath;
+    }
+
 }
 

+ 11 - 3
src/main/java/com/example/fms/controller/FileMangerController.java

@@ -4,10 +4,12 @@ import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.IdUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.example.fms.common.model.dto.FMSDeleteFileDTO;
+import com.example.fms.common.model.dto.UploadChuckDTO;
 import com.example.fms.common.utils.FileUtils;
 import com.example.fms.common.utils.Response;
 import com.example.fms.domain.SystemFile;
 import com.example.fms.exception.XiaoShiException;
+import com.example.fms.service.FileChuckService;
 import com.example.fms.service.FileMangerService;
 import com.example.fms.service.SystemFileService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -39,8 +41,7 @@ import java.util.List;
 public class FileMangerController {
     private final FileMangerService fileManagerService;
     private final SystemFileService systemFileService;
-    private final FileUtils fileUtils;
-
+    private final FileChuckService fileChuckService;
     @PostMapping("/uploadNormalFile")
     @Operation(summary = "上传普通文件")
     public String uploadNormalFile(@RequestBody List<MultipartFile> files, Integer sourceId) throws IOException {
@@ -205,8 +206,15 @@ public class FileMangerController {
     @PostMapping("/merge")
     @Operation(summary = "合并分片")
     public String uploadChunksMerge(String md5, String fileName)  throws Exception{
-      fileManagerService.uploadChunksMerge(md5);
+      fileManagerService.uploadChunksMerge(md5,fileName);
         return Response.success("saveUrl");
     }
 
+    @PostMapping("/startChunks")
+    @Operation(summary = "上传分片")
+    public String startChunks(@RequestBody UploadChuckDTO uploadChuckDTO) throws Exception {
+     Boolean flag =   fileChuckService.startChunks(uploadChuckDTO);
+        return Response.success(flag);
+    }
+
 }

+ 51 - 0
src/main/java/com/example/fms/service/FileChuckService.java

@@ -0,0 +1,51 @@
+package com.example.fms.service;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.example.fms.common.core.base.RedisConf;
+import com.example.fms.common.model.dto.UploadChuckDTO;
+import com.example.fms.common.model.vo.UploadChuckVO;
+import com.example.fms.common.utils.FileUtils;
+import com.example.fms.common.utils.JsonUtils;
+import com.example.fms.common.utils.RedisUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class FileChuckService {
+    private final RedisUtil redisUtil;
+    public Boolean startChunks(UploadChuckDTO uploadChuckDTO) {
+        String md5 = uploadChuckDTO.getMd5();
+        if (md5 == null) {
+            return false;
+        }
+        UploadChuckVO uploadChuckVO = new UploadChuckVO();
+        uploadChuckVO.setOrginName(uploadChuckDTO.getFileName());
+        String exrName = FileUtil.extName(uploadChuckDTO.getFileName());
+        String fileName = IdUtil.simpleUUID()+"."+exrName;
+        uploadChuckVO.setFileName(fileName);
+        uploadChuckVO.setExrName(exrName);
+        String key = this.getTemFileMessageKey(uploadChuckDTO.getMd5());
+        String jsons = JSONObject.toJSONString(uploadChuckVO);
+        redisUtil.set(key, jsons);
+        return true;
+    }
+
+    public String getTemFileMessageKey(String md5) {
+        String key = RedisConf.TEM_FILE_MESSAGE + RedisConf.SYMBOL_COLON + md5;
+        return key;
+    }
+
+    public UploadChuckVO getTemFileMessage(String md5) {
+        String key = this.getTemFileMessageKey(md5);
+        String jsons = redisUtil.get(key);
+        if (jsons == null) {
+            return null;
+        }
+        UploadChuckVO uploadChuckVO = JsonUtils.jsonToPojo(jsons, UploadChuckVO.class);
+        return uploadChuckVO;
+    }
+
+}

+ 21 - 15
src/main/java/com/example/fms/service/FileMangerService.java

@@ -1,18 +1,20 @@
 package com.example.fms.service;
 
 import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.model.CompleteMultipartUploadRequest;
 import com.aliyun.oss.model.CompleteMultipartUploadResult;
 import com.aliyun.oss.model.PartETag;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.example.fms.common.core.base.RedisConf;
 import com.example.fms.common.model.dto.DownloadSysFileDTO;
 import com.example.fms.common.model.dto.SystemFileDTO;
+import com.example.fms.common.model.dto.UploadChuckDTO;
 import com.example.fms.common.model.vo.ConfigSettingVO;
 import com.example.fms.common.model.vo.SystemFileVO;
-import com.example.fms.common.utils.ExcuteConfigUtils;
-import com.example.fms.common.utils.FileUtils;
-import com.example.fms.common.utils.Response;
+import com.example.fms.common.model.vo.UploadChuckVO;
+import com.example.fms.common.utils.*;
 import com.example.fms.domain.SystemFile;
 import com.example.fms.exception.XiaoShiException;
 import com.example.fms.mapper.SystemFileMapper;
@@ -44,6 +46,8 @@ public class FileMangerService {
     private final FileFactory fileFactory;
     private final FileUtils fileUtils;
     private final OssService ossService;
+    private final RedisUtil redisUtil;
+
     /**
      * 上传文件的最外部接口
      *
@@ -119,7 +123,7 @@ public class FileMangerService {
             Integer id = downloadSysFileDTO.getPType();
             //5.调用解析配置方法,获取配置信息
             List<ConfigSettingVO> configSettingVOS = ExcuteConfigUtils.excuteConfigVO();
-            if(configSettingVOS == null && configSettingVOS.size() == 0){
+            if (configSettingVOS == null && configSettingVOS.size() == 0) {
                 throw new XiaoShiException("缺失配置文件");
             }
             //6.根据id获取需要的配置类
@@ -161,7 +165,7 @@ public class FileMangerService {
                 LambdaQueryWrapper<SystemFile> queryWrapper = new LambdaQueryWrapper<>();
                 queryWrapper.eq(SystemFile::getGuid, guIds.get(i));
                 SystemFile systemFileVO = systemFileService.getOne(queryWrapper);
-                if(systemFileVO==null){
+                if (systemFileVO == null) {
                     continue;
                 }
                 //3.1.3 将对象的是否删除字段置为1
@@ -230,13 +234,13 @@ public class FileMangerService {
         LambdaQueryWrapper<SystemFile> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.select(SystemFile::getGuid);
         queryWrapper.like(SystemFile::getGuid, likeGuid);
-        List<SystemFile> systemFiles =systemFileService.list(queryWrapper);
-        List<String> guids =systemFiles.stream().map(SystemFile::getGuid).collect(Collectors.toList());
+        List<SystemFile> systemFiles = systemFileService.list(queryWrapper);
+        List<String> guids = systemFiles.stream().map(SystemFile::getGuid).collect(Collectors.toList());
         return guids;
     }
 
 
-    public void uploadChunks(MultipartFile file, String md5, Integer index) throws Exception{
+    public void uploadChunks(MultipartFile file, String md5, Integer index) throws Exception {
         //1.调用解析配置方法,获取配置信息
         List<ConfigSettingVO> configSettingVOS = ExcuteConfigUtils.excuteConfigVO();
         //2.根据传入id,获得配置类,根据配置类中的id去匹配sourceId来选择使用的上传方法
@@ -247,19 +251,21 @@ public class FileMangerService {
             tempDirectory.mkdir();
         }
         String savePath = tempPath + FileUtils.FILE_SEPARATOR + md5 + "-" + index;
-        File temFile =new File(savePath);
+        File temFile = new File(savePath);
         file.transferTo(temFile);
-        ossService.uploadChucks(temFile,configSettingVO,index,md5);
-
-
+        ossService.uploadChucks(temFile, configSettingVO, index, md5);
     }
-    public void uploadChunksMerge(String md5) throws Exception {
+
+    public void uploadChunksMerge(String md5, String name) throws Exception {
         //1.调用解析配置方法,获取配置信息
         List<ConfigSettingVO> configSettingVOS = ExcuteConfigUtils.excuteConfigVO();
         //2.根据传入id,获得配置类,根据配置类中的id去匹配sourceId来选择使用的上传方法
         ConfigSettingVO configSettingVO = configSettingVOS.stream().filter(item -> item.getId().equals(5)).findFirst().orElse(null);
-    ossService.uploadChunksMerge(configSettingVO,md5);
-
+        ossService.uploadChunksMerge(configSettingVO, md5);
 
     }
+
+
+
+
 }

+ 23 - 15
src/main/java/com/example/fms/service/OssService.java

@@ -11,6 +11,7 @@ import com.example.fms.common.core.base.RedisConf;
 import com.example.fms.common.model.dto.DownloadSysFileDTO;
 import com.example.fms.common.model.dto.SystemFileDTO;
 import com.example.fms.common.model.vo.ConfigSettingVO;
+import com.example.fms.common.model.vo.UploadChuckVO;
 import com.example.fms.common.utils.FileUtils;
 import com.example.fms.common.utils.JsonUtils;
 import com.example.fms.common.utils.RedisUtil;
@@ -34,7 +35,7 @@ import java.util.List;
 public class OssService {
     private final FileUtils fileUtils;
     private final RedisUtil redisUtil;
-
+    private final FileChuckService fileChuckService;
     //创建桶
     public void createBucket() throws Exception {
         // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
@@ -292,6 +293,7 @@ public class OssService {
 
 
     public void uploadChucks(File file, ConfigSettingVO configSettingVO, Integer index, String md5) throws Exception {
+        UploadChuckVO uploadChuckVO = fileChuckService.getTemFileMessage(md5);
         // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
         String endpoint = configSettingVO.getEndPoint();
         // 填写Bucket名称,例如examplebucket。
@@ -299,12 +301,8 @@ public class OssService {
 
         String accessKeyId = configSettingVO.getAccessKeyId();
         String accessKeySecret = configSettingVO.getAccessKeySecret();
-
-        String directory = fileUtils.getDirectoryName();
-
-        String tempFileName = file.getName();
         // 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
-        String objectName = "zhang.XLSX";
+        String objectName = uploadChuckVO.getFileName();
         // 创建OSSClient实例。
         OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
 
@@ -340,14 +338,14 @@ public class OssService {
             InputStream instream = new FileInputStream(file);
             uploadPartRequest.setInputStream(instream);
             // 设置分片号。每一个上传的分片都有一个分片号,取值范围是1~10000,如果超出此范围,OSS将返回InvalidArgument错误码。
-            uploadPartRequest.setPartNumber(index+1);
+            uploadPartRequest.setPartNumber(index + 1);
             // 每个分片不需要按顺序上传,甚至可以在不同客户端上传,OSS会按照分片号排序组成完整的文件。
             UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
             // 每次上传分片之后,OSS的返回结果包含PartETag。PartETag将被保存在partETags中。
             // partETags是PartETag的集合。PartETag由分片的ETag和分片号组成。
             List<PartETag> partETags = new ArrayList<PartETag>();
             partETags.add(uploadPartResult.getPartETag());
-            this.addPartETags(md5,uploadPartResult.getPartETag());
+            this.addPartETags(md5, uploadPartResult.getPartETag());
 
         } catch (OSSException oe) {
             System.out.println("Caught an OSSException, which means your request made it to OSS, "
@@ -379,7 +377,7 @@ public class OssService {
         String key = this.getPartETagRedisKey(md5);
         String json = redisUtil.get(key);
         if (json != null) {
-            partETags =  JSONArray.parseArray(json,PartETag.class);
+            partETags = JSONArray.parseArray(json, PartETag.class);
 
         }
         return partETags;
@@ -393,18 +391,17 @@ public class OssService {
             partETags = JsonUtils.jsonToList(json, PartETag.class);
         }
         partETags.add(partETag);
-       String jsons = JSONObject.toJSONString(partETags);
-       redisUtil.set(key,jsons);
-       return partETags;
+        String jsons = JSONObject.toJSONString(partETags);
+        redisUtil.set(key, jsons);
+        return partETags;
     }
 
     public void uploadChunksMerge(ConfigSettingVO configSettingVO, String md5) throws Exception {
-        String directory = fileUtils.getDirectoryName();
+        UploadChuckVO uploadChuckVO = fileChuckService.getTemFileMessage(md5);
         OSS ossClient = this.getOssClient(configSettingVO);
         String bucketName = configSettingVO.getBucketName();
         String uploadId = redisUtil.get(md5);
-        String tempFileName = IdUtil.simpleUUID() + "." + "xls";
-        String objectName = "zhang.XLSX";
+        String objectName = uploadChuckVO.getFileName();
         List<PartETag> partETags = this.getPartETags(md5);
         // 创建CompleteMultipartUploadRequest对象。
         // 在执行完成分片上传操作时,需要提供所有有效的partETags。OSS收到提交的partETags后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
@@ -417,4 +414,15 @@ public class OssService {
 
 
     }
+
+
+    public void removeRedisKey(String md5){
+        String key1 =md5;
+        String key2 =this.getPartETagRedisKey(md5);
+        List<String> keys =new ArrayList<>();
+        keys.add(key1);
+        keys.add(key2);
+        redisUtil.delete(keys);
+
+    }
 }

+ 5 - 4
src/main/resources/configSetting.json

@@ -34,14 +34,15 @@
     "userName": "root",
     "passWord": "cslg-pas-820f1e412aaf",
     "filePath": "/project/rms/prod/file/"
-  },{
+  },
+  {
     "sourceId": "2",
     "sourceName": "OSS",
     "id": 5,
-    "endPoint": "https://oss-cn-shanghai.aliyuncs.com",
+    "endPoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
     "accessKeyId": "LTAI5tGyG1Q7fKprgg1nWhXj",
     "accessKeySecret": "Y6Erboh5lEFiRPR4XK8oCPMvUzYGLN",
-    "bucketName": "xiaoshi-pas",
-    "filePath": "project/ecs/prod/file"
+    "bucketName": "xiaoshi-pas-syst",
+    "filePath": "project/pas/prod/file/"
   }
 ]