【问题标题】:How to concatenate zip files in PHP如何在 PHP 中连接 zip 文件
【发布时间】:2015-02-19 08:10:55
【问题描述】:

我使用 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 文件执行此操作?我不热衷于将 gzip 转换为 zip,因为生成的文件可能会大于 16 MB。

我注意到this question,和那个作者一样,我正在寻找一个开源解决方案。

【问题讨论】:

    标签: php zip


    【解决方案1】:

    我最终做的事情是这样的:

    1. 为每个分析创建一个 zip 文件,将其放入 /tmp 并确保名称是唯一的。
    2. 将这些临时 zip 文件及其大小放入一个列表中,按大小排序,最大的在前。
    3. 创建一个“真实”的 zip 文件,并遍历临时文件列表。
    4. 如果“真实”zip 文件的大小加上当前临时 zip 文件的大小小于限制,则将进入临时 zip 文件的文件添加到真实 zip 文件中。如果可以添加文件,请从列表和 /tmp 目录中删除临时 zip 文件。
    5. 如果“真实”zip 文件已满,而我们仍有临时 zip,请创建一个新的“真实”文件并返回第 4 步。

    这样就给出了一个 zip 文件列表,这些文件保证小于限制,并且应该是数量最少的。

    有几点需要注意:

    1. 如果您有一个简单的分析超出了限制,您将不得不自己处理它。这个算法不行。
    2. 我内部使用的限制比实际限制小 1 MB,因为我不确定 zipped(m) + zipped(n) 的大小是否保证大于 zipped(m + n)。

    虽然您可以在 PHP 中实现这一点,但我最终用 Python 编写了它,因为它必须在后台进程中完成,因为响应速度快,并且因为要求用户能够下载生成的 zip 文件超过必要时一次。有点武断,我选择在 Python 中进行所有后台处理。

    【讨论】:

    • 感谢您,Ignacio ... 但是,我真正想要的是能够很好地处理 zip 文件的东西,我不必将它们压缩两次。我可以用 gzip 文件做到这一点,但找不到任何可以处理 zip 文件的东西。失败的。所以我只是做了双拉链。
    • 如果您“存储”(0% 压缩)文件,那么您只需计算 zip 文件的固定开销并带走。
    猜你喜欢
    • 2023-03-12
    • 2023-03-21
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多