我正在尝试编写一个PHP脚本,从包含单个CSV文件的Web服务器下载zip文件,然后将解压缩的CSV文件的内容加载到现有的MySQL数据库表中。
$targetFile = 'data-' . md5(microtime()) . '.zip';
$url = 'http://www.address.com/data.zip';
$out = fopen('/path/to/zip/save/folder/' . $targetFile , 'wb');
$ch = curl_init();
curl_setopt($ch, CURLOPT_FILE, $out);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_exec($ch);
$info = curl_getinfo($ch);
if($info['http_code'] == 200 && $info['content_type'] == 'application/x-zip-compressed') {
$zh = zip_open('/path/to/zip/save/folder/' . $targetFile);
}
else {
exit('Download of ZIP file failed.');
}
上面的代码确实设法将文件下载到服务器上具有唯一名称的目录。但我无法提取内容。
我尝试使用PHP的zip_open
命令来解压缩zip,但它总是返回错误代码19
而不是句柄。我已经检查了传递给zip_open函数的路径,它是一个完整的系统路径,即/path/to/zip/save/folder/data-5384e2306718492958f20e68de95c6fa.zip
。
注意:
CSV文件文件压缩为2.5 MB,未压缩为30 MB。
答案 0 :(得分:2)
请记住在将内容另存为文件之前删除响应标头。此外,您可以检查是否有HTTP / 1.1 200 OK响应,或301/302重定向以跟随
答案 1 :(得分:1)
zip_open()错误号19是:“Zip文件功能错误:不是zip存档”。这意味着您的脚本没有正确下载zip文件。
答案 2 :(得分:0)
$ URL = “http://www.some.zip”; $ target ='data-'。 md5(microtime())。 '的.zip';
function download($src, $dst) {
$f = fopen($src, 'rb');
$o = fopen($dst, 'wb');
while (!feof($f)) {
if (fwrite($o, fread($f, 2048)) === FALSE) {
return 1;
}
}
fclose($f);
fclose($o);
return 0;
}
download($url,$target);
if ( file_exists($target) ){
# do your unzipping..
}
答案 3 :(得分:0)
我用这个
$r = new HTTPRequest($url);
$r->setOptions($options);
$r->send();
$code = $r->getResponseCode();
if (200 != $code) {
throw ...;
}
file_put_contents($zip, $r->getResponseBody());
$arc = new ZipArchive;
if (true !== $arc->open($zip)) {
throw ...;
}
file_put_contents($out, $arc->getFromIndex(0));
你应该可以从那里拿起它
答案 4 :(得分:0)
在我尝试打开ZIP文件之前,问题似乎是由于缺少fclose
调用。