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

Php 如何下载和解压缩压缩的CSV文件,并将CSV文件的内容放入MySQL表中,php,mysql,linux,zip,filesystems,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(); cu

我试图编写一个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\u open
命令提取zip,但它总是返回
19
的错误代码,而不是句柄。我已经检查了传递给zip_open函数的路径,它是一个完整的系统路径,即
/path/to/zip/save/folder/data-5384e2306718492958f20e68de95c6fa.zip

注意:


CSV文件压缩为2.5 MB,未压缩为30 MB。

zip_open()错误号19是:“zip文件函数错误:不是zip存档”。这意味着您的脚本没有正确下载zip文件

zip_open()错误号19是:“zip文件函数错误:不是zip存档”。这意味着您的脚本没有正确下载zip文件

在将内容保存为文件之前,请记住去掉响应标题。此外,您还可以检查是否有HTTP/1.1 200 OK响应,或者301/302重定向要遵循

在将内容保存为文件之前,请记住剥离响应头。此外,您还可以检查是否有HTTP/1.1 200 OK响应,或者301/302重定向要遵循http://www.some.zip"; $target='data-'。md5(microtime())”。拉链

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..
}
$url=”http://www.some.zip"; $target='data-'。md5(microtime())”。拉链

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..
}
我用这个

    $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));
你应该可以从那里捡到它

我用这个

    $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));

您应该能够从那里找到它

问题似乎是由于在我尝试打开ZIP文件之前缺少
fclose
调用造成的。

问题似乎是由于在我尝试打开ZIP文件之前缺少
fclose
调用造成的。

如果您将data-5384e2306718492958f20e68de95c6fa.ZIP下载回你的电脑,你能用WinZip或你最喜欢的编辑器打开吗?是的,我能。但这对我解决这个问题没有帮助。此脚本将通过CRON每天运行一次,因此不需要手动干预。如果您将data-5384e2306718492958f20e68de95c6fa.zip下载回您的计算机,是否可以使用WinZip或您最喜欢的编辑器打开它。是的,我可以这样做。但这对我解决这个问题没有帮助。这个脚本将通过CRON每天运行一次,因此不需要手动干预。我已经更新了我的示例以包含zip_开放代码。它仍然返回19。但该文件似乎已成功下载,因为我可以在文件夹中看到该文件,并使用Windows提取其内容。我已更新示例,以包含zip_开放代码。它仍然返回19。但该文件似乎下载成功,因为我可以在文件夹中看到该文件,并使用Windows提取其内容。我担心使用该文件,因为ZIP文件为2.5 MB,CSV文件解压为25 MB。我担心使用该文件,因为ZIP文件为2.5 MB,CSV文件解压为25 MB。