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

14

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

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

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

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


你正在使用哪个操作系统? - RobertPitt
2
@RobertPitt RHEL6 意味着 Red Hat Enterprise Linux 6 版本。 - Abadis
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实现”的PHP-only implementation或者pecl扩展

似乎某些类型的tar存在问题 http://stackoverflow.com/questions/37189687/phardata-class-fails-when-tar-contents-has-relative-paths - artfulrobot

5

Archive_Tar可以处理压缩文件吗?文档中没有说明它能否列出.tar文件中文件的列表。我不想提取文件,只想列出它们的内容。 - Michael
3
@Michael:是的,它支持 .gz 和 .bz2 压缩,并且其中有一个 ->listContent 方法和其他方法。 - mario

4
下面的代码读取一个在.gz压缩文件中的文件
    <?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扩展。


非常好。这对我很有帮助。 - anastymous

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

zlib扩展能处理TAR文件吗? - Michael
1
不,它只处理gz压缩/解压缩。你已经有更好的答案来处理你问题的tar方面了。 - Mark Baker

-1
要不要继续使用原始的tar库(如果已经预装了)?
echo shell_exec('tar -tf <path/to/file.tgz>');// lists the contents of a Gzipped Tarball

关于负评,我相信既然你有足够的声望来投票,那么在至少所有主要的Linux系统上运行良好的解决方案上添加一些评论总是比默默无声的匿名负评更好。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接