| src/main/java/com/dji/sample/media/controller/FileController.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/dji/sample/media/service/IFileService.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/dji/sample/media/util/MinioFileDownloader.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/dji/sample/media/util/UnZipPhotoUtil.java | ●●●●● patch | view | raw | blame | history |
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); } } 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); /** * 更新文件 * 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>() src/main/java/com/dji/sample/media/util/MinioFileDownloader.java
New file @@ -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(); } } } src/main/java/com/dji/sample/media/util/UnZipPhotoUtil.java
File was deleted