Browse Source

新增一个根据文件id批量获取文件预下载的url

lijie 3 years ago
parent
commit
87e8b2bc6d

+ 15 - 0
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/FileController.java

@@ -17,7 +17,10 @@ import com.persagy.dmp.file.service.IFileService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
+import javax.xml.transform.Result;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 文件管理Controller
@@ -98,6 +101,18 @@ public class FileController {
     }
 
     /***
+     * Description: 根据文件key批量获取预下载的URL
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.FileInfo>
+     * @author : lijie
+     * Update By lijie 2021/10/9 20:12
+     */
+    @PostMapping("/queryFetchUrlsByFileIds")
+    public CommonResult<Map<String,String>> queryFetchUrlsByFileIds(@RequestBody FileRequestData requestData) {
+        return ResultHelper.single(fileService.queryFetchUrlsByFileIds(requestData.getFileIds()));
+    }
+
+    /***
      * Description: 初始化断点上传文件
      * @param requestData : 请求参数
      * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.FileInfo>

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

@@ -8,6 +8,7 @@ import com.persagy.dmp.file.model.FileRequestData;
 import com.persagy.dmp.file.model.UploadMes;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -104,4 +105,12 @@ public interface IFileService extends IService<FileInfo> {
      */
     UploadMes secondTransmission(String fileName, String groupCode,
                                  String businessId, PsDate expireDate, String fileMd5, String fileId);
+    /***
+     * Description: 根据文件id批量查询预文件下载Url
+     * @param fileIds : 文件id集合
+     * @return : Map<String,String>
+     * @author : lijie
+     * Update By 2021/12/23 10:29
+     */
+    Map<String,String> queryFetchUrlsByFileIds(Set<String> fileIds);
 }

+ 7 - 0
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/IFileStorageService.java

@@ -38,6 +38,13 @@ public interface IFileStorageService {
     String fetchUrl(String bucketName, String fileName);
 
     /**
+     * 获取下载Url
+     * @param bucketName 桶名
+     * @param fileName 文件名
+     */
+    String fetchUrl(String bucketName, String fileName,Map<String,String> extraQueryParamsMap);
+
+    /**
      * 文件是否存在
      * @param bucketName 桶名
      * @param fileName 文件名

+ 5 - 5
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/CompatibleOldFileServiceImpl.java

@@ -288,11 +288,11 @@ public class CompatibleOldFileServiceImpl implements CompatibleOldFileService {
         }
         // 3.通过文件流的方式下载文件
         IoUtil.copy(service.download(fileInfo.getFileBucket(),fileInfo.getFilePath()),response.getOutputStream());
-        response.setHeader(CommonConstant.REPONSE_HEAD_CONTENT_DISPOSITION,
-                CommonConstant.REPONSE_HEAD_CONTENT_DISPOSITION_ATTACHMENT + URLEncoder.encode(fileInfo.getFileName(), "UTF-8"));
-        response.setHeader(CommonConstant.REPONSE_HEAD_CONTENT_LENGTH, null==fileInfo.getFileSize()?"0":fileInfo.getFileSize().toString());
-        response.setHeader("Accept-Ranges", "bytes");
-        response.setHeader("Content-Range", StrUtil.format("bytes {}-{}/{}", 0, fileInfo.getFileSize().toString(), fileInfo.getFileSize().toString()));
+        response.setHeader(FileCommonConst.REPONSE_HEAD_CONTENT_DISPOSITION, StrUtil
+                .format(FileCommonConst.REPONSE_HEAD_CONTENT_DISPOSITION_ATTACHMENT,
+                        URLEncoder.encode(fileInfo.getFileName(), "UTF-8")));
+        response.setHeader(FileCommonConst.REPONSE_HEAD_CONTENT_LENGTH,
+                null==fileInfo.getFileSize()?"0":fileInfo.getFileSize().toString());
         // 4.2021年12月22日12:00:21,先申请下载地址,然后通过重定向的方式直接请求文件服务器进行下载
 //        String fetchUrl = service.fetchUrl(fileInfo.getFileBucket(), fileInfo.getFilePath());
 //        if (StrUtil.isBlank(fetchUrl)){

+ 44 - 0
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/FileServiceImpl.java

@@ -1,15 +1,18 @@
 package com.persagy.dmp.file.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.persagy.dmp.common.constant.CommonConstant;
 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.lang.PsDate;
 import com.persagy.dmp.common.lang.PsDateTime;
+import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.file.constant.UploadCodeEnum;
 import com.persagy.dmp.file.model.*;
 import com.persagy.dmp.file.service.FileMd5Service;
@@ -20,9 +23,12 @@ import com.persagy.dmp.file.constant.FileCommonConst;
 import com.persagy.dmp.file.service.FileStorageFactory;
 import com.persagy.dmp.file.service.IFileStorageService;
 import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.File;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -305,6 +311,44 @@ public class FileServiceImpl extends ServiceImpl<FileMapper, FileInfo> implement
         uploadMes.setUploadCode(UploadCodeEnum.CODE_200.getCode());
         return uploadMes;
     }
+    /***
+     * Description: 根据文件id集合批量查询文件信息
+     * @param fileIds : 文件id集合
+     * @return : java.util.Map<java.lang.String,java.lang.String>
+     * @author : lijie
+     * Update By 2021/12/23 10:29
+     */
+    @SneakyThrows
+    @Override
+    public Map<String, String> queryFetchUrlsByFileIds(Set<String> fileIds) {
+        // 1.判断必填项
+        if(CollUtil.isEmpty(fileIds)) {
+            return new HashMap<>(0);
+        }
+        List<FileInfo> fileInfos = fileMapper.getFileInfoByIds(fileIds);
+        if (CollUtil.isEmpty(fileInfos)){
+            return new HashMap<>(0);
+        }
+        List<FileInfo> filterInfos = fileInfos.stream()
+                .filter(fileInfo -> FileCommonConst.UPLOAD_SUCCESS.equals(fileInfo.getUploadStatus())
+                                    && (StrUtil.isNotBlank(fileInfo.getFileBucket())
+                                        && StrUtil.isNotBlank(fileInfo.getFilePath())))
+                .collect(Collectors.toList());
+        if (CollUtil.isEmpty(filterInfos)){
+            return new HashMap<>(0);
+        }
+        Map<String, String> map = new HashMap<>(filterInfos.size());
+        IFileStorageService service = FileStorageFactory.getService();
+        for (FileInfo filterInfo : filterInfos) {
+            String fetchUrl = service.fetchUrl(filterInfo.getFileBucket(),
+                    filterInfo.getFilePath(), MapUtil
+                            .of(FileCommonConst.RESPONSE_CONTENT_DISPOSITION,StrUtil
+                                    .format(FileCommonConst.REPONSE_HEAD_CONTENT_DISPOSITION_ATTACHMENT,
+                                            URLEncoder.encode(filterInfo.getFileName(), "UTF-8"))));
+            map.put(filterInfo.getId(),fetchUrl);
+        }
+        return map;
+    }
 
     /***
      * Description: 初次上传和已有文件信息但未上传任何分片的情况下则直接生成所有上传url

+ 7 - 0
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/HdfsStorageServiceImpl.java

@@ -15,6 +15,7 @@ import org.apache.hadoop.fs.Path;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -98,6 +99,11 @@ public class HdfsStorageServiceImpl implements IFileStorageService {
 
     @Override
     public String fetchUrl(String bucketName, String fileName) {
+        return fetchUrl(bucketName,fileName,new HashMap<>(0));
+    }
+
+    @Override
+    public String fetchUrl(String bucketName, String fileName, Map<String, String> extraQueryParamsMap) {
         // 容错判断
         if(StrUtil.isBlank(fileName)) {
             throw new BusinessException("下载文件参数有误!");
@@ -105,6 +111,7 @@ public class HdfsStorageServiceImpl implements IFileStorageService {
         // TODO
         return null;
     }
+
     /**
      * 文件是否存在
      * @param bucketName 桶名

+ 17 - 6
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/MinioStorageServiceImpl.java

@@ -150,7 +150,8 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
             bucketName = ensureBucket(bucketName);
             // 下载文件
 //            return minioClient.getObject(bucketName, fileName);
-            return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
+            return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName)
+                    .build());
         } catch (Exception e) {
             FileExceptionHandler.handleException(e);
         }
@@ -158,7 +159,7 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
     }
 
     @Override
-    public String fetchUrl(String bucketName, String fileName) {
+    public String fetchUrl(String bucketName, String fileName,Map<String,String> extraQueryParamsMap) {
         // 容错判断
         if(StrUtil.isBlank(fileName)) {
             throw new BusinessException("下载文件参数有误!");
@@ -166,10 +167,15 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
         try {
             // 确认桶是否存在
             bucketName = ensureBucket(bucketName);
-            // 下载文件
-//            return minioClient.presignedGetObject(bucketName, fileName, FileCommonConst.URL_EXPIRES);
-            return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET)
-                    .bucket(bucketName).object(fileName).expiry(FileCommonConst.URL_EXPIRES).build());
+            GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs
+                    .builder()
+                    .method(Method.GET)
+                    .bucket(bucketName).object(fileName)
+                    .expiry(FileCommonConst.URL_EXPIRES);
+            if (MapUtil.isNotEmpty(extraQueryParamsMap)){
+                builder.extraQueryParams(extraQueryParamsMap);
+            }
+            return minioClient.getPresignedObjectUrl(builder.build());
         } catch (Exception e) {
             FileExceptionHandler.handleException(e);
         }
@@ -177,6 +183,11 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
     }
 
     @Override
+    public String fetchUrl(String bucketName, String fileName) {
+        return fetchUrl(bucketName,fileName,new HashMap<>(0));
+    }
+
+    @Override
     public boolean exists(String bucketName, String fileName) {
         // 容错判断
         if(StrUtil.isBlank(fileName)) {

+ 0 - 6
dmp-common/src/main/java/com/persagy/dmp/common/constant/CommonConstant.java

@@ -54,10 +54,4 @@ public interface CommonConstant {
     String REMOVE_FIELD ="$remove";
     /** result字段 */
     String RESULT ="result";
-    /**响应头:Content-disposition*/
-    String REPONSE_HEAD_CONTENT_DISPOSITION = "Content-disposition";
-    /**响应头:Content-disposition*/
-    String REPONSE_HEAD_CONTENT_LENGTH = "Content-Length";
-    /**响应头:attachment;filename=*/
-    String REPONSE_HEAD_CONTENT_DISPOSITION_ATTACHMENT = "attachment;filename=";
 }

+ 8 - 0
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/constant/FileCommonConst.java

@@ -20,4 +20,12 @@ public interface FileCommonConst {
     String BUCKET_PATTERN = "^[a-z0-9][a-z0-9\\-]*[a-z0-9]$";
     /** 分片文件的后缀 */
     String CHUCK_FILE_SUFFIX = ".chunk";
+    /**响应头:Content-disposition*/
+    String REPONSE_HEAD_CONTENT_DISPOSITION = "Content-disposition";
+    /**响应头:Content-disposition*/
+    String REPONSE_HEAD_CONTENT_LENGTH = "Content-Length";
+    /**响应头:attachment;filename=*/
+    String REPONSE_HEAD_CONTENT_DISPOSITION_ATTACHMENT = "attachment;filename={}";
+    /**响应头:minio的查询参数*/
+    String RESPONSE_CONTENT_DISPOSITION = "response-content-disposition";
 }

+ 4 - 0
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/model/FileRequestData.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.util.Set;
 
 /***
  * Description: 文件请求参数
@@ -58,6 +59,9 @@ public class FileRequestData implements Serializable {
     /**业务id*/
     private String businessId;
 
+    /**文件id*/
+    private Set<String> fileIds;
+
     /**过期时间,入参格式为yyyyMMddHHmmss*/
     @DateTimeFormat(pattern = "yyyyMMddHHmmss")
     private PsDate expireDate;