如何下载和提取压缩CSV并将CSV文件的内容放入MySQL表中

时间:2010-01-25 17:51:04

标签: php mysql linux zip filesystems

我正在尝试编写一个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。

5 个答案:

答案 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调用。