From 43b6292b4b2810560bbf2d22c96bd44c11d4160b Mon Sep 17 00:00:00 2001
From: rain <167982779@qq.com>
Date: Mon, 22 Jul 2024 10:29:06 +0800
Subject: [PATCH] 将文件获取后压缩在服务器

---
 src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java |   46 +++++++----
 /dev/null                                                            |   80 --------------------
 src/main/java/com/dji/sample/media/controller/FileController.java    |    9 +-
 src/main/java/com/dji/sample/media/util/MinioFileDownloader.java     |   80 ++++++++++++++++++++
 src/main/java/com/dji/sample/media/service/IFileService.java         |    3 
 5 files changed, 115 insertions(+), 103 deletions(-)

diff --git a/src/main/java/com/dji/sample/media/controller/FileController.java b/src/main/java/com/dji/sample/media/controller/FileController.java
index 8a0093f..66db157 100644
--- a/src/main/java/com/dji/sample/media/controller/FileController.java
+++ b/src/main/java/com/dji/sample/media/controller/FileController.java
@@ -9,9 +9,11 @@
 import com.dji.sample.media.model.MediaFileQueryParam;
 import com.dji.sample.media.service.IFileService;
 import com.dji.sample.media.util.ImageDownloaderAndCompressor;
+import com.dji.sample.media.util.MinioFileDownloader;
 import com.drew.imaging.ImageProcessingException;
 import org.apache.ibatis.annotations.Update;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockHttpServletResponse;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -171,9 +173,8 @@
         }
     }
 
-    @GetMapping("/download-images")
-    public void downloadImages(@RequestParam String jobId, HttpServletResponse response) {
-    fileService.downloadImages(jobId,response);
+    @PostMapping("/download-images")
+    public ResponseResult downloadImages(@RequestBody List<String> jobIds) {
+        return fileService.downloadImages(jobIds);
     }
-
 }
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/media/service/IFileService.java b/src/main/java/com/dji/sample/media/service/IFileService.java
index 41eb659..71ef2cd 100644
--- a/src/main/java/com/dji/sample/media/service/IFileService.java
+++ b/src/main/java/com/dji/sample/media/service/IFileService.java
@@ -104,7 +104,7 @@
      */
     URL getObjectUrl(String workspaceId, String fileId);
 
-    void downloadImages( String jobId, HttpServletResponse response);
+    ResponseResult downloadImages( List<String> jobIds);
 
     /**
      * Query all media files of a job.
@@ -115,6 +115,7 @@
      */
     List<MediaFileDTO> getFilesByWorkspaceAndJobId(String workspaceId, String jobId);
 
+    List<String> getUniqueFilePaths(List<String> jobIds);
     /**
      * 更新文件
      *
diff --git a/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java b/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
index 3b944e5..c1d2c61 100644
--- a/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
+++ b/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
@@ -22,6 +22,7 @@
 import com.dji.sample.media.model.*;
 import com.dji.sample.media.service.IFileService;
 import com.dji.sample.media.util.ImgUtil;
+import com.dji.sample.media.util.MinioFileDownloader;
 import com.dji.sample.patches.dao.GetPatchesMapper;
 import com.dji.sample.patches.model.entity.LotInfo;
 import com.dji.sample.patches.utils.DistrictCodeUtils;
@@ -432,26 +433,35 @@
     }
 
     @Override
-    public void downloadImages(String jobId, HttpServletResponse response) {
-        String address = pojo.getEndpoint() + "/" + pojo.getBucket();
-        List<MediaFileEntity> entities = getMedia(jobId);
-        List<String> urls = entities.stream()
-                .map(MediaFileEntity::getObjectKey)
-                .map(objectKey -> address + objectKey)
-                .collect(Collectors.toList());
-        String outputFolder = "images"; // 存放图片的文件夹
-        new File(outputFolder).mkdirs(); // 创建文件夹
+    public ResponseResult downloadImages(List<String> jobIds) {
         try {
-            downloadAndSaveImages(urls, outputFolder);
-            zipAndSendFolder(outputFolder, response);
-        } catch (Exception e) {
-            e.printStackTrace();
-            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-        } finally {
-            cleanUp(outputFolder);
-        }
-    }
+            String bucketPath = "/data/software/minio-data/cloud-bucket/";
+            List<String> prefixes = getUniqueFilePaths(jobIds);
 
+            MinioFileDownloader downloader = new MinioFileDownloader(bucketPath);
+
+            // 下载并压缩文件到本地目录
+            String localSaveDir = "/data/software/minio-data/zip-bucket/"; // 修改为你想保存的本地目录
+            downloader.downloadAndZipFolders(prefixes, localSaveDir);
+
+            System.out.println("压缩文件已保存到:" + localSaveDir);
+
+        }  catch (Exception e) {
+            e.printStackTrace();
+            return ResponseResult.error("下载失败"+e.getMessage());
+        }
+        return ResponseResult.success("下载成功");
+    }
+    @Override
+    public List<String> getUniqueFilePaths(List<String> jobIds) {
+        return mapper.selectList(
+                        new LambdaQueryWrapper<MediaFileEntity>()
+                                .in(MediaFileEntity::getJobId, jobIds))
+                .stream()
+                .map(MediaFileEntity::getFilePath)
+                .distinct()
+                .collect(Collectors.toList());
+    }
     @Override
     public List<MediaFileDTO> getFilesByWorkspaceAndJobId(String workspaceId, String jobId) {
         return mapper.selectList(new LambdaQueryWrapper<MediaFileEntity>()
diff --git a/src/main/java/com/dji/sample/media/util/MinioFileDownloader.java b/src/main/java/com/dji/sample/media/util/MinioFileDownloader.java
new file mode 100644
index 0000000..5fb038a
--- /dev/null
+++ b/src/main/java/com/dji/sample/media/util/MinioFileDownloader.java
@@ -0,0 +1,80 @@
+package com.dji.sample.media.util;
+
+import java.io.*;
+import java.nio.file.*;
+import java.util.*;
+import java.util.zip.*;
+
+public class MinioFileDownloader {
+
+    private final String bucketPath;
+
+    public MinioFileDownloader(String bucketPath) {
+        this.bucketPath = bucketPath;
+    }
+
+    public void downloadAndZipFolders(List<String> prefixes, String localSaveDir) throws Exception {
+        // 创建目标文件夹路径并生成zip文件名
+        Path localSavePath = Paths.get(localSaveDir);
+        if (!Files.exists(localSavePath)) {
+            Files.createDirectories(localSavePath);
+        }
+        String zipFileName = localSavePath.resolve("compressed_files.zip").toString();
+
+        // 创建压缩文件输出流
+        try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName))) {
+            zos.setLevel(Deflater.BEST_COMPRESSION); // 使用最高压缩级别
+
+            // 遍历每个前缀
+            for (String prefix : prefixes) {
+                // 从本地文件系统获取文件
+                String localFolderPath = bucketPath + "/" + prefix;
+                File localFolder = new File(localFolderPath);
+                if (!localFolder.exists() || !localFolder.isDirectory()) {
+                    throw new FileNotFoundException("Local folder not found: " + localFolderPath);
+                }
+
+                // 压缩文件夹
+                zipFolder(localFolder, prefix, zos);
+            }
+        }
+    }
+
+    private void zipFolder(File folder, String parentFolder, ZipOutputStream zos) throws IOException {
+        for (File file : folder.listFiles()) {
+            if (file.isDirectory()) {
+                zipFolder(file, parentFolder + "/" + file.getName(), zos);
+                continue;
+            }
+            zos.putNextEntry(new ZipEntry(parentFolder + "/" + file.getName()));
+            try (FileInputStream fis = new FileInputStream(file)) {
+                byte[] buffer = new byte[1024];
+                int length;
+                while ((length = fis.read(buffer)) >= 0) {
+                    zos.write(buffer, 0, length);
+                }
+            }
+            zos.closeEntry();
+        }
+    }
+
+    public static void main(String[] args) {
+        try {
+            String bucketPath = "/data/software/minio-data/cloud-bucket";
+            List<String> prefixes = List.of(
+                    "c88e9f12-9fab-4aca-8fc4-b02d0b0ce5f2/DJI_202407151726_001_c88e9f12-9fab-4aca-8fc4-b02d0b0ce5f2/"
+            );
+
+            MinioFileDownloader downloader = new MinioFileDownloader(bucketPath);
+
+            // 下载并压缩文件到本地目录
+            String localSaveDir = "/path/to/local/save/directory"; // 修改为你想保存的本地目录
+            downloader.downloadAndZipFolders(prefixes, localSaveDir);
+
+            System.out.println("压缩文件已保存到:" + localSaveDir);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/java/com/dji/sample/media/util/UnZipPhotoUtil.java b/src/main/java/com/dji/sample/media/util/UnZipPhotoUtil.java
deleted file mode 100644
index 45789c9..0000000
--- a/src/main/java/com/dji/sample/media/util/UnZipPhotoUtil.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.dji.sample.media.util;
-
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.util.List;
-import java.util.Objects;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-public class UnZipPhotoUtil {
-
-    public static void downloadAndSaveImages(List<String> urls, String outputFolder) throws IOException {
-        int count = 0;
-        for (String imageUrl : urls) {
-            try {
-                // 下载图片
-                URL url = new URL(imageUrl);
-                BufferedImage image = ImageIO.read(url);
-
-                // 保存图片
-                File outputfile = new File(outputFolder, "image_" + (count++) + ".jpg");
-                ImageIO.write(image, "jpg", outputfile);
-                System.out.println("Saved: " + outputfile.getAbsolutePath());
-            } catch (IOException e) {
-                System.err.println("Failed to download image: " + imageUrl);
-                e.printStackTrace();
-                throw e;
-            }
-        }
-    }
-
-    public static void zipFolder(String srcFolder, String destZipFile) throws IOException {
-        try (FileOutputStream fos = new FileOutputStream(destZipFile);
-             ZipOutputStream zos = new ZipOutputStream(fos)) {
-
-            File srcFile = new File(srcFolder);
-            for (File file : Objects.requireNonNull(srcFile.listFiles())) {
-                try (FileInputStream fis = new FileInputStream(file)) {
-                    ZipEntry zipEntry = new ZipEntry(file.getName());
-                    zos.putNextEntry(zipEntry);
-
-                    byte[] bytes = new byte[1024];
-                    int length;
-                    while ((length = fis.read(bytes)) >= 0) {
-                        zos.write(bytes, 0, length);
-                    }
-                    zos.closeEntry();
-                } catch (IOException e) {
-                    System.err.println("Failed to zip file: " + file.getPath());
-                    e.printStackTrace();
-                    throw e;
-                }
-            }
-        }
-    }
-
-    public static void cleanUp(String folderName) {
-        File folder = new File(folderName);
-        deleteFolder(folder);
-    }
-
-    public static void deleteFolder(File folder) {
-        File[] files = folder.listFiles();
-        if (files != null) {
-            for (File f : files) {
-                if (f.isDirectory()) {
-                    deleteFolder(f);
-                } else {
-                    f.delete();
-                }
-            }
-        }
-        folder.delete();
-    }
-}

--
Gitblit v1.9.3