Как я могу прочитать файл .tar.gz с PHP? - PullRequest
13 голосов
/ 02 февраля 2011

Я строю систему, чтобы люди могли загружать файлы .tar (и .tar.gz, .tar.bz2, .zip и т. Д.) В PHP. Загрузка файлов - это нормально, но я бы хотел перечислить файлы, содержащиеся в архиве после его загрузки.

Может кто-нибудь порекомендовать хорошую библиотеку PHP, которая может читать файловые архивы?

Я нашел File_Archive на Pear, но он не обновлялся в течение нескольких лет. ZipArchive отлично работает с файлами .zip, но мне нужно что-то, что может обрабатывать больше типов файлов.

обновление Я работаю на RHEL6, PHP 5.2 и Apache 2.2.

Ответы [ 5 ]

27 голосов
/ 02 февраля 2011

Вы можете сделать это с PharData классом:

// Example: list files
$archive = new PharData('/some/file.tar.gz');
foreach($archive as $file) {
        echo "$file\n";
}

Это работает даже с потоковой оболочкой phar://:

$list = scandir('phar:///some/file.tar.gz');
$fd = fopen('phar:///some/file.tar.gz/some/file/in/the/archive', 'r');
$contents = file_get_contents('phar:///some/file.tar.gz/some/file/in/the/archive');

Если у вас нет Phar, проверьте реализацию только для PHP или расширение pecl .

4 голосов
/ 21 сентября 2012

Приведенный ниже код читает файл внутри .gz zip-файла

    <?php
    $z = gzopen('zipfile.gz','r') or die("can't open: $php_errormsg");
    $string = '';

    while ($line = gzgets($z,1024)) {
        $string .= $line;
    }

    echo $string;

    gzclose($z) or die("can't close: $php_errormsg");
    ?>

Обратите внимание , что для работы этого кода необходимо включить расширение zip для php.

3 голосов
/ 02 февраля 2011

Не пытайтесь построить это самостоятельно.Используйте существующий класс, такой как http://pear.php.net/package/Archive_Tar, чтобы справиться с этим для вас.

2 голосов
/ 27 мая 2015

Я не думаю, что первый ответ работает. Или это только не работает для меня. Вы не можете читать содержимое файла, когда вы его просматриваете. Я даю свой рабочий код ниже.

$fh = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('phar:///dir/file.tar.gz'),
    RecursiveIteratorIterator::CHILD_FIRST
);

foreach ($fh as $splFileInfo) {
    echo file_get_contents($splFileInfo->getPathname());
}

Это работает для файлов gz, zip, tar и bz.

2 голосов
/ 02 февраля 2011

Используйте расширение zlib

...