这是我正在使用的代码的一个非常简化的版本。
$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_contents
和file_put_contents
的调用PHP使用本地版本。当我这样做时,zip_read
正确地在ZIP中找到适当数量的文件,处理按预期进行。
我也试过这样做:$zip = zip_open($url)
但$zip
未通过is_resource($zip)
检查。
我的代码显然有问题,因为URL工作并返回有效的ZIP存档。它是什么?
答案 0 :(得分:0)
所以我终于找到了问题所在。按照@ diolemo的建议,我在十六进制编辑器中打开了服务器的ZIP存档。这是我在顶部找到的内容,然后是通常的ZIP二进制数据:http://pastebin.com/vQEXJtTN
事实证明,有一个PHP错误与ZIP文件的实际内容混在一起。不确定如何解决这个问题(但知道它肯定与HTTP标头有关),我尝试了this guy's code,你知道,我的代码现在完美运行了!
经验教训?永远不要相信你的数据,即使它似乎没问题(7-Zip和Winrar都设法打开文件没有问题)。