大家好,我编写了一个从远程源下载zip文件的脚本,然后将zip文件解压缩到目录中。以下是剧本:
<?php
$url = "http://example.com/some_file.zip";
download($url,'file.zip');
function download($url,$file_name = NULL){
if($file_name == NULL){ $file_name = basename($url);}
$url_stuff = parse_url($url);
$port = isset($url_stuff['port']) ? $url_stuff['port'] : 80;
$fp = fsockopen($url_stuff['host'], $port);
if(!$fp){ return false;}
$query = 'GET ' . $url_stuff['path'] . " HTTP/1.0\n";
$query .= 'Host: ' . $url_stuff['host'];
$query .= "\n\n";
fwrite($fp, $query);
while ($tmp = fread($fp, 8192)) {
$buffer .= $tmp;
}
preg_match('/Content-Length: ([0-9]+)/', $buffer, $parts);
$file_binary = substr($buffer, - $parts[1]);
if($file_name == NULL){
$temp = explode(".",$url);
$file_name = $temp[count($temp)-1];
}
if(!file_exists("packages")){ mkdir("packages", 0755);}
$file_open = fopen("packages/" . $file_name,'w');
if(!$file_open){ return false;}
fwrite($file_open,$file_binary);
$zip = zip_open(realpath("packages")."/".$file_name);
if ($zip) {
while ($zip_entry = zip_read($zip)) {
$fp = fopen("some_dir/".zip_entry_name($zip_entry), "w");
if(zip_entry_open($zip, $zip_entry, "r")) {
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
fwrite($fp,"$buf");
zip_entry_close($zip_entry);
fclose($fp);
}
}
zip_close($zip);
}
fclose($file_open);
return true;
}
?>
我遇到的问题是,当远程文件的下载完美无缺时,我似乎无法提取它。 zip_read()
和zip_close()
返回错误,表示“希望参数1为资源,给定整数...”,我发现这意味着zip_open()
无法提取并且是返回错误代码,我发现它是“19”,意思是“Zip文件功能错误:不是zip存档”。但是,我知道我下载的文件实际上是一个zip文件。谁能解释这种奇怪的行为并提供修复?非常感谢!
答案 0 :(得分:4)
引用php.net:“zip_open()...返回一个资源句柄,供以后与zip_read()和zip_close()一起使用,或者如果filename不存在或者出现其他错误,则返回错误数。”< / p>
这意味着您无法像这样测试if ($zip)
。尝试
if ( is_resource($zip) ) {
// stuff
} else {
print "Zip_open() returned error $zip\n";
}
编辑除此之外,您还需要正确地分成2个部分。您严重依赖Content-Length
参数。您不检查preg_match
是否实际匹配。很多事情都可能出错,你应该检查一下。尝试将内容分成第一个空行(explode
上的\r\n\r\n
或类似内容)
除fread()
循环外,还应该检查feof()
,因为如果由于某种原因你会遇到空的读取,你现在就会停止阅读。从php.net复制并粘贴:
while (!feof($handle)) {
$contents .= fread($handle, 8192);
}
但我们可以继续这里。必须提出三个要点:
这些是相关的:您必须查阅手册以查看可能遇到的返回值。