最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中實現多文件打包下載的兩種方案

 更新時間:2025年09月08日 08:37:03   作者:IT界Tony哥  
在Spring Boot中實現多文件打包下載,一般是將多個文件壓縮成一個ZIP文件再進行下載,以下是兩種典型實現方案以及代碼示例,需要的朋友可以參考下

在Spring Boot中實現多文件打包下載,主要通過將多個文件壓縮為ZIP格式并返回給客戶端。以下是兩種典型實現方案:

??一、本地文件打包下載??

??核心步驟??

  1. ??接收文件列表參數??
    通過@RequestParam List<String> filenames接收前端傳遞的文件名列表。
  2. ??動態(tài)生成ZIP文件??
    使用ZipOutputStream將文件逐個寫入內存流,避免生成物理文件。
  3. ??設置響應頭??
    通過Content-Disposition指定文件名,Content-Type設置為application/zip。

??代碼示例??

@GetMapping("/download-multiple")
public ResponseEntity<byte[]> downloadMultipleFiles(@RequestParam List<String> filenames) {
    try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ZipOutputStream zos = new ZipOutputStream(baos)) {
         
        for (String filename : filenames) {
            Path filePath = Paths.get("/path/to/files").resolve(filename).normalize();
            if (Files.exists(filePath)) {
                ZipEntry zipEntry = new ZipEntry(filename);
                zos.putNextEntry(zipEntry);
                Files.copy(filePath, zos);
                zos.closeEntry();
            }
        }
        zos.finish();

        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="files.zip"");
        return ResponseEntity.ok().headers(headers).body(baos.toByteArray());
    } catch (IOException e) {
        return ResponseEntity.internalServerError().build();
    }
}

??關鍵點??:

  • 使用try-with-resources自動關閉流,避免資源泄漏。
  • normalize()方法防止路徑遍歷攻擊(如../../)。
  • 內存中生成ZIP,適合小文件場景。

??二、云存儲(MinIO)集成方案??

若文件存儲在云存儲(如MinIO),需先獲取文件流再壓縮:

??實現步驟??

??配置MinIO客戶端??
添加依賴并配置MinIO連接信息:

minio:
  url: http://localhost:9000
  accessKey: your-key
  secretKey: your-secret
  bucketName: your-bucket

??動態(tài)壓縮云存儲文件??
從MinIO獲取文件流,直接寫入ZIP輸出流:

@Autowired
private MinioClient minioClient;

@GetMapping("/download-zip")
public void downloadZip(@RequestParam List<String> fileNames, HttpServletResponse response) {
    response.setContentType("application/zip");
    response.setHeader("Content-Disposition", "attachment; filename=download.zip");
    
    try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
        for (String fileName : fileNames) {
            try (InputStream inputStream = minioClient.getObject(
                    GetObjectArgs.builder().bucket(bucketName).object(fileName).build())) {
                ZipEntry zipEntry = new ZipEntry(fileName);
                zos.putNextEntry(zipEntry);
                IOUtils.copy(inputStream, zos);
                zos.closeEntry();
            }
        }
    } catch (Exception e) {
        throw new RuntimeException("下載失敗", e);
    }
}

??優(yōu)化點??:

  • 直接流式傳輸,避免內存溢出。
  • 支持斷點續(xù)傳(需結合HTTP Range請求)。

??三、注意事項??

  1. ??內存管理??
    大文件建議使用流式壓縮(如ZipOutputStream),避免OutOfMemoryError。
  2. ??路徑安全??
    使用normalize()過濾非法路徑,防止路徑遍歷攻擊。
  3. ??異常處理??
    捕獲IOException并返回明確錯誤狀態(tài)碼(如404文件不存在)。
  4. ??擴展性??
    可結合分片下載(Range請求)支持大文件斷點續(xù)傳。

??四、前端調用示例??

// 使用Fetch API觸發(fā)下載
fetch(`/download-multiple?filenames=file1.txt,file2.jpg`, {
    method: 'GET'
}).then(response => {
    const blob = new Blob([response.blob()]);
    const link = document.createElement('a');
    link.href = URL.createObjectURL(blob);
    link.download = 'files.zip';
    link.click();
});

通過上述方案,可靈活實現本地或云存儲的多文件打包下載,根據實際需求選擇內存或流式處理。

到此這篇關于SpringBoot中實現多文件打包下載的兩種方案的文章就介紹到這了,更多相關SpringBoot多文件打包下載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mybatis Generator最完美配置文件詳解(完整版)

    Mybatis Generator最完美配置文件詳解(完整版)

    今天小編給大家整理了一篇關于Mybatis Generator最完美配置文件詳解教程,非常不錯具有參考借鑒價值,感興趣的朋友一起學習吧
    2016-11-11
  • 基于java枚舉類綜合應用的說明

    基于java枚舉類綜合應用的說明

    一個枚舉類,可以看成包括它的一些子類(枚舉)的一個類,而且枚舉類的構造方法只能是私有的
    2013-05-05
  • 深入Spring Boot之ClassLoader的繼承關系和影響

    深入Spring Boot之ClassLoader的繼承關系和影響

    這篇文章主要介紹了深入Spring Boot之ClassLoader的繼承關系和影響,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Spring WebSocket 404錯誤的解決方法

    Spring WebSocket 404錯誤的解決方法

    這篇文章主要為大家詳細介紹了Spring WebSocket 404錯誤的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java使用ffmpeg和mencoder實現視頻轉碼

    Java使用ffmpeg和mencoder實現視頻轉碼

    這篇文章主要為大家詳細介紹了Java使用ffmpeg和mencoder實現視頻轉碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • java中for和forEach的速度比較實例Demo

    java中for和forEach的速度比較實例Demo

    for循環(huán)中的循環(huán)條件中的變量只求一次值,而foreach語句是java5新增,在遍歷數組、集合的時候,foreach擁有不錯的性能,這篇文章主要給大家介紹了關于java中for和forEach速度比較的相關資料,需要的朋友可以參考下
    2021-08-08
  • Java實現的樸素貝葉斯算法示例

    Java實現的樸素貝葉斯算法示例

    這篇文章主要介紹了Java實現的樸素貝葉斯算法,結合實例形式分析了基于java的樸素貝葉斯算法定義及樣本數據訓練操作相關使用技巧,需要的朋友可以參考下
    2018-06-06
  • Java String類用法詳解

    Java String類用法詳解

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著Java String類用法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • java實現線性表及其算法

    java實現線性表及其算法

    線性表是最簡單和最常用的一種數據結構,它是有n個體數據元素(節(jié)點)組成的有限序列,這篇文章主要介紹了java實現線性表及其算法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • @RequestBody注解的原理及使用技巧分享

    @RequestBody注解的原理及使用技巧分享

    這篇文章主要介紹了@RequestBody注解的原理及使用技巧分享,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論

平泉县| 略阳县| 江源县| 南投县| 政和县| 谢通门县| 陵水| 东阳市| 治县。| 泰宁县| 吉林省| 昭通市| 依安县| 天柱县| 宝应县| 长寿区| 鄂托克前旗| 留坝县| 内丘县| 淮滨县| 惠水县| 库车县| 合阳县| 武定县| 双辽市| 祁门县| 顺昌县| 南乐县| 个旧市| 永兴县| 咸宁市| 青浦区| 塔河县| 永昌县| 施甸县| 古蔺县| 武安市| 罗定市| 汉寿县| 灵丘县| 嘉峪关市|