如何使用 PHP 读取 .tar.gz 文件?

问题描述 投票:0回答:6

我正在构建一个系统,供人们用 PHP 上传 .tar(以及 .tar.gz、.tar.bz2、.zip 等)文件。上传文件没问题,但我想在上传后列出存档中包含的文件。

有人可以推荐一个好的可以读取文件档案的PHP库吗?

我在 Pear 上找到了 File_Archive,但它已经几年没有更新了。 ZipArchive 对于 .zip 文件非常有用,但我需要可以处理更多文件类型的东西。

更新 我正在 RHEL6、PHP 5.2 和 Apache 2.2 上运行。

php zip tar
6个回答
31
投票

您可以使用

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 扩展


5
投票

不要尝试自己构建这个。使用现有的类(如 http://pear.php.net/package/Archive_Tar)来为您处理该问题。


4
投票

下面的代码读取 .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");
    ?>

注意,您需要启用 php 的 zip 扩展名才能使此代码正常工作。


3
投票

我认为第一个答案不起作用。或者它只是对我不起作用。 foreach 时无法读取文件内容。我在下面给出了我的工作代码。

$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
投票

使用zlib扩展


0
投票

坚持使用原始 tar 库(如果预安装)怎么样?

echo shell_exec('tar -tf <path/to/file.tgz>');// lists the contents of a Gzipped Tarball
© www.soinside.com 2019 - 2024. All rights reserved.