簡體   English   中英

如何在PHP中連接zip文件

[英]How to concatenate zip files in PHP

我使用ZipArchive構建了一個zip文件,其中包含如下目錄結構:

analysis_name /
    attachment_file_1.pdf
    attachment_file_2.jpg
    attachment_file_3.jpg
    attachment_file_4.jpg
    attachment_file_5.xlsx

這一切都很好,我可以讓用戶下載它而不用擔心。 要求是他們需要能夠將多個分析擬合到一個zip文件中,以便我們有這樣的東西:

analysis_name_1 /
    attachment_file_1_1.pdf
    attachment_file_1_2.jpg
    ...
analysis_name_2 /
    attachment_file_2_1.pdf
    attachment_file_2_2.jpg
    ...
analysis_name_n /
    attachment_file_3_1.pdf
    attachment_file_3_2.jpg
    ...

我面臨的問題是這些組合的zip文件不能超過16 MB,因為它們必須上傳到不同的站點。 所以我要說我有20個分析,大小從500 K到6 MB不等。 如果我使用gzip,我很確定我可以進行單獨的分析gzip,貪婪地連接它們直到下一個文件超過16 MB,然后啟動一個新文件。

是否可以使用zip文件執行此操作? 我並不熱衷於將gzips轉換為zips,因為生成的文件可能會大於16 MB。

我注意到這個問題 ,就像那個作家一樣,我正在尋找一個開源解決方案。

我最終做的是這樣做:

  1. 為每個分析創建一個zip文件,將其放在/ tmp中並確保名稱是唯一的。
  2. 將這些臨時zip文件及其大小放入列表中,按大小排序,先排序最大。
  3. 創建一個“真正的”zip文件,並遍歷臨時文件列表。
  4. 如果“真實”zip文件的大小加上當前臨時zip文件的大小小於限制,請將進入臨時zip文件的文件添加到真正的zip文件中。 如果可以添加文件,請從列表和/ tmp目錄中刪除臨時zip文件。
  5. 如果“真正的”zip文件已滿並且我們仍然有臨時拉鏈,請創建一個新的“真實”文件並返回步驟4。

因此,它提供了一個保證小於限制的zip文件列表,並且應該是最少的。

有幾點需要注意:

  1. 如果您只有一個分析並且超出限制,那么您必須自己處理它。 這個算法不會這樣做。
  2. 我在內部使用的限制比實際限制小1 MB,因為我不確定zipped(m)+ zipped(n)的大小是否保證大於zipped(m + n)。

雖然您可以在PHP中實現它,但我最終用Python編寫它,因為它必須在后台進程中由於響應性而完成,並且因為要求用戶能夠在必要時多次下載生成的zip文件。 有點隨意,我選擇在Python中進行所有后台處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM