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

SpringBoot中實現(xiàn)多文件打包下載的兩種方案

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

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

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

??核心步驟??

  1. ??接收文件列表參數(shù)??
    通過@RequestParam List<String> filenames接收前端傳遞的文件名列表。
  2. ??動態(tài)生成ZIP文件??
    使用ZipOutputStream將文件逐個寫入內(nèi)存流,避免生成物理文件。
  3. ??設(shè)置響應(yīng)頭??
    通過Content-Disposition指定文件名,Content-Type設(shè)置為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();
    }
}

??關(guān)鍵點??:

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

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

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

??實現(xiàn)步驟??

??配置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)化點??:

  • 直接流式傳輸,避免內(nèi)存溢出。
  • 支持?jǐn)帱c續(xù)傳(需結(jié)合HTTP Range請求)。

??三、注意事項??

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

??四、前端調(diào)用示例??

// 使用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();
});

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

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

相關(guān)文章

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

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

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

    基于java枚舉類綜合應(yīng)用的說明

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

    深入Spring Boot之ClassLoader的繼承關(guān)系和影響

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

    Spring WebSocket 404錯誤的解決方法

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

    Java使用ffmpeg和mencoder實現(xiàn)視頻轉(zhuǎn)碼

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

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

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

    Java實現(xiàn)的樸素貝葉斯算法示例

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

    Java String類用法詳解

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

    java實現(xiàn)線性表及其算法

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

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

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

最新評論

冕宁县| 旌德县| 都兰县| 交城县| 泾阳县| 个旧市| 集安市| 江永县| 荣成市| 漳浦县| 乡城县| 台前县| 陕西省| 习水县| 伊通| 临沧市| 乐清市| 牡丹江市| 和田县| 临泉县| 阿图什市| 普兰店市| 赣州市| 松滋市| 石景山区| 大新县| 碌曲县| 汉沽区| 财经| 麻城市| 五峰| 邻水| 亚东县| 温州市| 乌拉特后旗| 沈阳市| 太仆寺旗| 衢州市| 北碚区| 乃东县| 上思县|