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