rain
2024-07-22 43b6292b4b2810560bbf2d22c96bd44c11d4160b
将文件获取后压缩在服务器
3 files modified
1 files added
1 files deleted
212 ■■■■ changed files
src/main/java/com/dji/sample/media/controller/FileController.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/media/service/IFileService.java 3 ●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java 40 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/media/util/MinioFileDownloader.java 80 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/media/util/UnZipPhotoUtil.java 80 ●●●●● 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);
            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();
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        } finally {
            cleanUp(outputFolder);
            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