3 回答

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

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 內存中來冒太大的風險。

TA貢獻1850條經驗 獲得超11個贊
這種方法的唯一缺點是:客戶端將無法顯示下載狀態欄,因為服務器將無法發送“Content-length”標頭。這是因為 ZIP 文件的大小只有在生成后才能知道,而服務器需要先發送文件頭。所以 - 沒有臨時 zip 文件 - 事先沒有文件大小。
您還在談論子目錄。這只是處理 ZIP 流時的命名問題。每個 zip 項目都需要這樣命名:“directory/directory2/file.txt”。這將在解壓縮時產生子目錄。
添加回答
舉報