如何在PHP中连接zip文件

时间:2015-02-19 08:10:55

标签: php zip

我使用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,我很确定我可以进行单独的分析gzips,贪婪地连接它们直到下一个文件超过16 MB,然后开始一个新文件。

是否可以使用zip文件执行此操作?我并不热衷于将gzips转换为zips,因为生成的文件可能会大于16 MB。

我注意到this question,就像那位作家一样,我正在寻找一个开源解决方案。

1 个答案:

答案 0 :(得分:0)

我最终做的是:

  1. 为每个分析创建一个zip文件,将其放入/ tmp并确保名称是唯一的。
  2. 将这些临时zip文件及其大小放入列表中,按大小排序,先排序最大。
  3. 创建一个真实的" zip文件,并遍历临时文件列表。
  4. 如果"真实"的大小zip文件加上当前临时zip文件的大小小于限制,将进入临时zip文件的文件添加到真正的zip文件中。如果可以添加文件,请从列表和/ tmp目录中删除临时zip文件。
  5. 如果"真实" zip文件已满,我们仍然有临时拉链,创建一个新的"真正的"文件并返回步骤4.
  6. 这样就会给出一个保证小于限制的zip文件列表,并且应该是最少的。

    有几点需要注意:

    1. 如果您只有一个分析符合并超出限制,那么您必须自己处理。这个算法不会这样做。
    2. 我在内部使用的限制比实际限制小1 MB,因为我不确定拉链(m)+拉链(n)的尺寸是否保证大于拉链(m + n)
    3. 虽然您可以在PHP中实现这一点,但我最终用Python编写它,因为它必须在后台进程中由于响应性而完成,并且因为要求用户能够下载生成的zip文件而不是必要时一次。有些随意,我选择在Python中进行所有后台处理。