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

发布于 2024-08-19 06:49:16 字数 988 浏览 6 评论 0原文

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

I'm trying to write a PHP script to download a zip file from a web server that contains a single CSV file and then load the contents of the extracted CSV file into an existing MySQL database table.

$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.');
}

The above code does manage to download the file to a directory on the server with a unique name. But I am unable to extract the contents.

I've tried using PHP's zip_open command to extract the zip but it always returns an error code of 19 instead of a handle. I've checked the path that I pass to the zip_open function and it's a full system path i.e. /path/to/zip/save/folder/data-5384e2306718492958f20e68de95c6fa.zip.

Note:

The CSV file file is 2.5 MB compressed and 30 MB uncompressed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

ゃ人海孤独症 2024-08-26 06:49:16

请记住在将内容保存为文件之前删除响应标头。另外,您可以检查是否有 HTTP/1.1 200 OK 响应,或 301/302 重定向跟随

Remember to strip response headers before saving content as file. Also, you can check if there was HTTP/1.1 200 OK response, or 301/302 redirects to follow

回心转意 2024-08-26 06:49:16

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

zip_open() error number 19 is: "Zip File Function error: Not a zip archive". That means your script did not download the zip file properly.

寻找一个思念的角度 2024-08-26 06:49:16

$url="http://www.some.zip";
$target = '数据-' 。 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()) . '.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..
}
七色彩虹 2024-08-26 06:49:16

我用这个

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

你应该可以从那里拿起它

I use this

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

you should be able to pick it up from there

谢绝鈎搭 2024-08-26 06:49:16

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

It seems that the problem was due to a missing fclose call before I tried to open the ZIP file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文