ZipStream在PHP中动态创建的zip文件不会在OSX中打开

前端之家收集整理的这篇文章主要介绍了ZipStream在PHP中动态创建的zip文件不会在OSX中打开前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个 PHP网站有很多媒体文件,用户需要能够一次下载多个文件作为.zip.我试图使用 ZipStream在“存储”压缩的情况下随时为拉链提供服务,因此我实际上不必在服务器上创建一个zip,因为一些文件是巨大的,压缩它们的速度太慢了.

这是非常好的结果文件可以打开每个zip程序,我尝试没有错误,除了OS X的默认解压缩程序,存档实用程序.您双击.zip文件,并且Archive Utility决定它不是真正的zip,而是压缩到.cpgz文件中.

在OS X终端或StuffIt Expander中使用unzip或ditto解压缩文件,但无需任何问题,但我需要默认程序(Archive Utility)才能为我们的用户服务.

否则可接受的zip文件中的什么样的东西(标志等)可以将Archive Utility设为考虑文件不是有效的zip?

我已经阅读了this question,这似乎描述了一个类似的问题,但我没有任何一个通用的bitfield位设置,所以这不是第三个问题,我很确定我有有效的crc-32的,因为当我不,WinRAR扔了一个合适.

我很高兴发布一些代码链接到一个“坏”的zip文件,如果它有帮助,但我几乎只是使用ZipStream,强制它进入“大文件模式”,并使用“存储”作为压缩方法.

编辑 – 我也尝试过“压缩”压缩算法,并获得相同的结果,所以我不认为这是“商店”.还有一点值得指出的是,我从存储服务器一次将文件从存储服务器中拉出,并在发送出去时将它们发送出去,以便在发送任何内容之前需要下载所有文件解决方案不会变得可行(极端例如是5GB的20MB文件,用户不能等待所有的5GB在下载开始之前转移到压缩服务器,否则他们会认为它是坏的)

这是一个140字节的“存储”压缩测试zip文件,表现出这样的行为:http://teknocowboys.com/test.zip

问题出现在“需要提取的版本”字段中,我发现通过在ZipStream创建的文件上创建一个十六进制差异,并通过Info-zip创建的文件进行解析,并尝试解决这些问题.

ZipStream默认设置为0x0603. Info-zip将其设置为0x000A.具有前一个值的Zip文件似乎不在Archive Utility中打开.也许它不支持该版本的功能

强制“需要提取的版本”到0x000A使得生成文件也在Archive Utility中以及其他地方都可以打开.

编辑:导致此问题的另一个原因是如果使用Safari(用户代理版本> = 537)下载了zip文件,并且在发送了Content-Length头文件时,低于该文件的大小.

我们采用的解决方案是检测Safari> = 537服务器端,如果这是您正在使用的,我们可以确定Content-Length大小与实际大小之间的差异(您的具体取决于具体应用程序)以及之后调用$zipStream-> finish(),我们回显chr(0)以达到正确的长度.所产生的文件在技术上是格式错误的,您在zip中放置的任何注释都不会显示,但是所有的zip程序都可以打开并解压缩文件.

如果您误报了Content-Length,IE需要相同的黑客攻击,而不是下载不起作用的文件,则不会完成下载并引发“下载中断”.

猜你在找的PHP相关文章