嘿大家,我已經寫了一個腳本,從遠程源下載zip文件,然後應該解壓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文件。任何人都可以解釋這種奇怪的行爲並提供修復嗎?這將非常感謝!
在執行壓縮操作之前,您應該'fclose($ file_open)'。在這一點上,您不再需要'$ file_open'手柄,並且在同一個文件上保留兩個手柄是很麻煩的。我不認爲這是問題的原因。 – deceze 2010-07-28 01:24:51
是的,這是有道理的,謝謝你幫忙清理。但是,是的,正如你所建議的,這個問題一點都沒有改變。 – 2010-07-28 01:40:50
順便說一句,我真的很喜歡這種方式來研究HTTP,但你有沒有使用'file_get_contents(「http://.../」)','curl_open'等等? – mvds 2010-07-28 01:54:13