Как я могу скачать и распаковать архив в формате CSV и получить содержимое файла CSV в таблицу MySQL - PullRequest
0 голосов
/ 25 января 2010

Я пытаюсь написать скрипт PHP для загрузки zip-файла с веб-сервера, который содержит один CSV-файл, а затем загрузить содержимое извлеченного 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 МБ сжатый и 30 МБ несжатый.

Ответы [ 5 ]

2 голосов
/ 25 января 2010

Не забудьте удалить заголовки ответа перед сохранением содержимого в виде файла. Кроме того, вы можете проверить, был ли ответ HTTP / 1.1 200 OK, или перенаправления 301/302, чтобы следовать

1 голос
/ 25 января 2010

zip_open () ошибка номер 19: «Ошибка функции Zip-файла: не zip-архив». Это означает, что ваш скрипт не загрузил ZIP-файл должным образом.

0 голосов
/ 26 января 2010

Кажется, что проблема была из-за пропущенного вызова fclose, прежде чем я попытался открыть файл ZIP.

0 голосов
/ 26 января 2010

Я использую это

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

вы сможете забрать его оттуда

0 голосов
/ 26 января 2010

$ URL = "http://www.some.zip"; $ target = 'data-'. MD5 (микротайм ()). '.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..
}
...