Нужен PHP-скрипт для распаковки и циклического просмотра заархивированного файла

Я использую довольно простой скрипт для открытия и анализа нескольких XML-файлов, сжатых gzip. Мне также нужно проделать ту же базовую операцию с ZIP-файлом. Кажется, что это должно быть просто, но я нигде не смог найти что-то похожее на эквивалентный код.

Вот простая версия того, что я уже делаю:

$import_file = "source.gz";

$sfp = gzopen($import_file, "rb");  /////  OPEN GZIPPED data
while ($string = gzread($sfp, 4096)) {    //Loop through the data

    /// Parse Output And Do Stuff with $string
}
gzclose($sfp);      

Что будет делать то же самое для заархивированного файла?


person Jim H.    schedule 08.04.2010    source источник


Ответы (2)


Если у вас PHP 5 >= 5.2.0, PECL zip >= 1.5.0, вы можете использовать библиотеки ZipArchive:

$zip = new ZipArchive; 
if ($zip->open('source.zip') === TRUE) 
{ 
     for($i = 0; $i < $zip->numFiles; $i++) 
     {   
        $fp = $zip->getStream($zip->getNameIndex($i));
        if(!$fp) exit("failed\n");
        while (!feof($fp)) {
            $contents = fread($fp, 8192);
            // do some stuff
        }
        fclose($fp);
     }
} 
else 
{ 
     echo 'Error reading zip-archive!'; 
} 
person thetaiko    schedule 08.04.2010
comment
thetaiko - Это именно то, что мне нужно. Спасибо. Однако вам нужно исправить две небольшие ошибки. Закрывающая скобка для цикла for отсутствует, а для fread также требуется параметр длины. Исправьте эти два, и он работает как шарм. Будет ли он работать также с соединениями HTTP и FTP? Если да, можете ли вы также передать ему имя пользователя и пароль. Еще раз спасибо, Джим - person Jim H.; 08.04.2010
comment
Хм, не уверен, что именно вы подразумеваете под работой с HTTP и FTP-соединениями. Я бы предположил, что вы можете пройти его любым путем, но я не пробовал. Вместо того, чтобы передавать 'source.zip' в $zip->open(), попробуйте следующее: $zip->open('http://some.url.com/source.zip'); - person thetaiko; 08.04.2010
comment
Я попробую, когда у меня будет шанс. Если это сработает, мой следующий вопрос будет заключаться в том, как передать имя пользователя и пароль, когда вы хотите подключиться через ftp. Но я предполагаю, что он не позволяет этого. Это сделало бы мою жизнь слишком легкой. - person Jim H.; 08.04.2010
comment
На самом деле, я думаю, что обычно вы можете передать имя пользователя и пароль следующим образом: ftp://username:[email protected]/path - person thetaiko; 08.04.2010

Это можно сделать с помощью ZipArchive. Вы можете использовать цикл for с ZipArchive::statIndex(), чтобы получить всю необходимую информацию. Вы можете получить доступ к файлам по их индексу (ZipArchive::getFromIndex()) или имени (ZipArchive::getFromName()).

Например:

function processZip(string $zipFile): bool
{
    $zip = new ZipArchive();
    if ($zip->open($zipFile) !== true) {
        echo '<p>Can\'t open zip archive!</p>';
        return false;
    }

    // As long as statIndex() does not return false keep iterating
    for ($idx = 0; $zipFile = $zip->statIndex($idx); $idx++) {
        $directory = \dirname($zipFile['name']);

        if (!\is_dir($zipFile['name'])) {
            // file contents
            $contents = $zip->getFromIndex($idx);
        }
    }
    $zip->close();
}
person Dharman    schedule 14.10.2020