亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

創建 zip 文件而不寫入磁盤

創建 zip 文件而不寫入磁盤

不負相思意 2023-04-13 15:00:59
我正在開發一個 Springboot 應用程序,當用戶下載一些報告時,它必須將一個 zip 文件返回到前端。我想創建一個 zip 文件而不將 zip 文件或原始文件寫入磁盤。我要壓縮的目錄包含其他目錄,其中包含實際文件。例如dir1里面有subDir1和subDir2,subDir1會有兩個文件subDir1File1.pdf和subDir1File2.pdf。subDir2 里面也會有文件。我可以通過在磁盤上創建物理文件輕松地做到這一點。但是,我覺得返回這些文件而不寫入磁盤會更優雅。
查看完整描述

3 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

如果范圍是寫入內存,您將使用ByteArrayOutputStream 。本質上,zip 文件將完全包含在內存中,因此請確保您不會冒一次有太多請求的風險,并且文件大小是合理的!否則這種方法會嚴重適得其反!



查看完整回答
反對 回復 2023-04-13
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

您可以使用以下代碼段:


public static byte[] zip(final String str) throws IOException {


        if (StringUtils.isEmpty(str)) {

            throw new IllegalArgumentException("Cannot zip null or empty string");

        }


        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        try (GZIPOutputStream gos = new GZIPOutputStream(bos)) {

            gos.write(str.getBytes(StandardCharsets.UTF_8));

        }

        return bos.toByteArray();


    }

但是正如另一個答案中所述,請確保您不會通過將所有內容加載到您的 Java 內存中來冒太大的風險。


查看完整回答
反對 回復 2023-04-13
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

這種方法的唯一缺點是:客戶端將無法顯示下載狀態欄,因為服務器將無法發送“Content-length”標頭。這是因為 ZIP 文件的大小只有在生成后才能知道,而服務器需要先發送文件頭。所以 - 沒有臨時 zip 文件 - 事先沒有文件大小。

您還在談論子目錄。這只是處理 ZIP 流時的命名問題。每個 zip 項目都需要這樣命名:“directory/directory2/file.txt”。這將在解壓縮時產生子目錄。


查看完整回答
反對 回復 2023-04-13
  • 3 回答
  • 0 關注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號