gpt4 book ai didi

php - 流式 ZIP 文件无法在 OSX 中打开

转载 作者:行者123 更新时间:2023-11-28 08:19:23 27 4
gpt4 key购买 nike

我正在创建一个类来从 PHP 流式传输 ZIP 文件。

在 WinRAR、Windows 压缩文件夹、BetterZip 等中打开时,输出绝对没问题,但在 OSX Unarchiver 中打开时,我得到的只是一个 .cpgz 文件,没有别的。

我一遍又一遍地阅读了 ZIP 规范,并对照我的标题进行了交叉检查,一切看起来都很好。我确实在这里找到了另一个问题,它似乎有同样的问题,但解决方案是将我对 0x0014 所做的“需要提取的版本”字段更改,并且在尝试解压缩时出现“不允许操作”错误。

我已经上传了一个示例 zip 文件,里面有一个文件夹和一张小图片:

http://www.freefilehosting.net/test_97

下面是代码的工作原理:

// File entry header
echo pack('V', 0x04034b50);
echo pack('v', 0x0014); // Version needed to extract
echo pack('v', $dir ? 0 : 0x0808); // General purpose bit flag for unknown CRC
echo pack('v', 0x00); // Compression method (store)
echo pack('V', $dts); // DOS timestamp
echo pack('V', 0x00); // CRC - empty
echo pack('V', 0x00); // Compressed data length
echo pack('V', 0x00); // Decompressed data length
echo pack('v', strlen($filename)); // Length of filename
echo pack('v', 0x00); // Length of additional data

<snip>Output raw file data</snip>

// File entry trailer
echo pack('V', 0x08074b50); // Magic
echo pack('V', $crc); // CRC generated using crc32b algo
echo pack('V', $data_size); // Compressed size
echo pack('V', $total_size); // Uncompressed size

// CDR record
echo pack('V', 0x02014b50); // Magic
echo pack('v', 0x0014); // Version created by
echo pack('v', 0x0014); // Version req'd to open
echo pack('v', 0x00); // General purpose bit
echo pack('v', 0x00); // Compression method (store)
echo pack('V', $dts); // DOS timestamp
echo pack('V', $crc); // CRC of data
echo pack('V', $data_size); // Compressed size
echo pack('V', $total_size); // Uncompressed size
echo pack('v', strlen($filename)); // Filename length
echo pack('v', 0x00); // Extra data length
echo pack('v', 0x00); // Comment length
echo pack('v', 0x00); // Start disk no.
echo pack('v', 0x00); // Internal file attributes
echo pack('V', $dir ? 16 : 32); // External file attributes
echo pack('V', $offset); // Relative offset

// End of file record
echo pack('V', 0x06054b50); // Magic
echo pack('v', 0x00); // Current disk number
echo pack('v', 0x00); // Disk containing CDR
echo pack('v', $count); // Number of entries in this CDR
echo pack('v', $count); // Total number of CDR entries
echo pack('V', $cdr_len); // Length of CDR
echo pack('V', $cdr_offset); // Offset of CDR
echo pack('v', 0x00); // Zip file comment length

最佳答案

回答我自己的问题,问题是 OSX 不喜欢两件事。 1) 将额外的元数据(大小、CRC 等)附加到目录记录的末尾,因为这不是绝对必要的(但在规范内)。并且 2) 它不支持存储方法 0x00(存储),文件必须至少处于 DEFLATED 状态才能被 OSX 解压器打开。

关于php - 流式 ZIP 文件无法在 OSX 中打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6507984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com