소스 검색

fix bug:下载文件的时候未返回Content-Length

lijie 3 년 전
부모
커밋
7710e73a36

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

@@ -2,6 +2,7 @@ package com.persagy.dmp.file.service;
 
 import lombok.SneakyThrows;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.swing.filechooser.FileView;
 import java.io.InputStream;
 import java.util.Date;
@@ -229,4 +230,11 @@ public interface IFileStorageService {
      */
     void uploadChuck(String chuckBucketName, String fileMd5, InputStream inputStream,Integer totalChunks,
                      Integer currentChuckNumber);
+    /**
+     * 文件下载
+     * @param bucketName 桶名
+     * @param fileName 文件名
+     * @param response 响应对象
+     */
+    InputStream download(String bucketName, String fileName, HttpServletResponse response,String realFileName);
 }

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

@@ -287,12 +287,7 @@ public class CompatibleOldFileServiceImpl implements CompatibleOldFileService {
             return;
         }
         // 3.通过文件流的方式下载文件
-        IoUtil.copy(service.download(fileInfo.getFileBucket(),fileInfo.getFilePath()),response.getOutputStream());
-        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());
+        IoUtil.copy(service.download(fileInfo.getFileBucket(),fileInfo.getFilePath(),response,fileInfo.getFileName()),response.getOutputStream());
         // 4.2021年12月22日12:00:21,先申请下载地址,然后通过重定向的方式直接请求文件服务器进行下载
 //        String fetchUrl = service.fetchUrl(fileInfo.getFileBucket(), fileInfo.getFilePath());
 //        if (StrUtil.isBlank(fetchUrl)){

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

@@ -13,6 +13,7 @@ import org.apache.hadoop.fs.FSDataOutputStream;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
@@ -81,6 +82,11 @@ public class HdfsStorageServiceImpl implements IFileStorageService {
      */
     @Override
     public InputStream download(String bucketName, String fileName) {
+        return download(bucketName,fileName,null,null);
+    }
+
+    @Override
+    public InputStream download(String bucketName, String fileName, HttpServletResponse response,String realFileName) {
         // 容错判断
         if(StrUtil.isBlank(fileName)) {
             throw new BusinessException("下载文件参数有误!");

+ 25 - 9
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/MinioStorageServiceImpl.java

@@ -17,11 +17,14 @@ import io.minio.messages.Item;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import okhttp3.Headers;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Value;
 
+import javax.servlet.http.HttpServletResponse;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -120,9 +123,6 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
             return;
         }
         // 开始检查分片,每次都从头到尾检查一遍.防止出现并发上传的分片
-
-
-
         String lastObjName = objectNames.get(objectNames.size() - 1);
         StatObjectResponse objectResponse = minioClient
                 .statObject(StatObjectArgs.builder().bucket(bucketName).object(lastObjName).build());
@@ -134,13 +134,20 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
         }
         InputStream lastObj = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(lastObjName).build());
         byte[] lastBytes = IoUtil.readBytes(lastObj);
-
-
-
     }
 
     @Override
     public InputStream download(String bucketName, String fileName) {
+        return download(bucketName,fileName,null,null);
+    }
+    /**
+     * 文件下载
+     * @param bucketName 桶名
+     * @param fileName 文件名
+     * @param response 响应对象
+     */
+    @Override
+    public InputStream download(String bucketName, String fileName, HttpServletResponse response,String realFileName) {
         // 容错判断
         if(StrUtil.isBlank(fileName)) {
             throw new BusinessException("下载文件参数有误!");
@@ -149,9 +156,18 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
             // 确认桶是否存在
             bucketName = ensureBucket(bucketName);
             // 下载文件
-//            return minioClient.getObject(bucketName, fileName);
-            return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName)
-                    .build());
+            GetObjectResponse objectResponse = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
+            if (null!=response){
+                // 添加header
+                Headers headers = objectResponse.headers();
+                headers.names().forEach(name->response.addHeader(name,headers.get(name)));
+                if (StrUtil.isNotBlank(realFileName)){
+                    response.addHeader(FileCommonConst.REPONSE_HEAD_CONTENT_DISPOSITION, StrUtil
+                            .format(FileCommonConst.REPONSE_HEAD_CONTENT_DISPOSITION_ATTACHMENT,
+                                    URLEncoder.encode(realFileName, "UTF-8")));
+                }
+            }
+            return objectResponse;
         } catch (Exception e) {
             FileExceptionHandler.handleException(e);
         }