PHP处理一个zip文件,好像它是空的

时间:2013-12-04 21:09:46

标签: php zip

这是我正在使用的代码的一个非常简化的版本。

$url = "http://server.com/getDaFile";

//Get the file from the server
$zip_file_contents = file_get_contents($url);
//Write file to disk
file_put_contents("file.zip", $zip_file_contents);

//open zip file
$zip = zip_open("file.zip");

if(is_resource($zip))
{
    while($zip_entry = zip_read($zip))
    {
        if(zip_entry_open($zip, $zip_entry, 'r'))
        {
            //Read the whole file
            $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));

            /*
            Do stuff with $buf!!!
            */

            zip_entry_close($zip_entry);
        }
    }

    zip_close($zip);
}
else
{
    echo "Not a resource. Oh noes!\n";
}

所以:获取文件,将其保存到磁盘,解压缩以提取其中包含的文件,对文件执行操作。这里的问题是,由于某些原因我无法弄清楚,zip_read返回FALSE,好像它无法读取ZIP存档中的文件。 $zip确实包含资源,我已使用var_dump进行了检查。

这让我更奇怪的是,我在我的电脑上使用顶部的URL下载了ZIP文件,手动将其上传到PHP服务器,并注释了对file_get_contentsfile_put_contents的调用PHP使用本地版本。当我这样做时,zip_read正确地在ZIP中找到适当数量的文件,处理按预期进行。

我也试过这样做:$zip = zip_open($url)$zip未通过is_resource($zip)检查。

我的代码显然有问题,因为URL工作并返回有效的ZIP存档。它是什么?

1 个答案:

答案 0 :(得分:0)

所以我终于找到了问题所在。按照@ diolemo的建议,我在十六进制编辑器中打开了服务器的ZIP存档。这是我在顶部找到的内容,然后是通常的ZIP二进制数据:http://pastebin.com/vQEXJtTN

事实证明,有一个PHP错误与ZIP文件的实际内容混在一起。不确定如何解决这个问题(但知道它肯定与HTTP标头有关),我尝试了this guy's code,你知道,我的代码现在完美运行了!

经验教训?永远不要相信你的数据,即使它似乎没问题(7-Zip和Winrar都设法打开文件没有问题)。