使用 PHP,我如何识别(如果适用,解压缩)并从 .tar、.gz、.tar.gz、.zip 文件中提取文件?

Posted

技术标签:

【中文标题】使用 PHP,我如何识别(如果适用,解压缩)并从 .tar、.gz、.tar.gz、.zip 文件中提取文件?【英文标题】:Using PHP, how can I identify, (decompress if applicable), and extract the files from .tar, .gz, .tar.gz, .zip files? 【发布时间】:2015-06-18 03:50:05 【问题描述】:

我知道\Phar\PharData 存在,但到目前为止他们提供的方法我遇到了一些问题。在确定使用哪个Phar*::method() 以尝试提取存档并处理其中包含的文件之前,我仍然必须通过任何方式检测 mime 类型/文件类型。

是否有一个我可以包含的首选“简单按钮”类(也许可以通过 composer 获得一些包),它可以在非常高的级别上处理这个问题?还是我没有正确使用Phar 和朋友,或者到目前为止需要重新RTM?

基本上,我想做以下事情(这是我现在控制的 CLI 脚本,因此安全性虽然对这类事情很重要,但目前处于次要地位):

    检测文件可能是某种存档。 验证它似乎是以下之一:.tar.gz.tar.gz.zip。 如果是这样,请尝试提取存档,然后解析其实际文件的内容。

是否有一个我不知道的“简单按钮”,或者我是否需要构建一些逻辑来尽可能地猜测它可能是什么类型的存档,然后尝试使用适当的Phar* 方法来尝试提取它的文件并执行我需要对它们进行的任何工作?

我希望我写它的方式是有意义的。如果有人基本上已经弄清楚了所有这些,我会尽量避免在这里为一个小型项目重新发明***。

【问题讨论】:

$ext = pathinfo($filename, PATHINFO_EXTENSION); @Abdulla 是的,我一直在寻找一种高级解决方案,可以让我变得更懒惰,所以我不必编写样板代码来识别然后提取可能的档案来获取文件.就像我说的那样,如果有某种我可以利用和依赖的“交钥匙”解决方案,我只是想避免重新发明***。 这里有Phar::isCompressed 函数,这可能就是你要找的。​​span> @l'L'l 嗯。是的,我似乎忽略了那个方法,但我有点希望这是一个静态方法,它只会返回 true 或 false。如果它不是可接受的文件,它会在类构造函数中引发异常。好像我遗漏了一些东西,但是如果我必须在检查它是否是可接受的文件之前基本上检查它是否是一个可接受的文件,那么我能从中得到什么? @l'L'l 好吧,我肯定错过了那个小花絮。谢谢! 【参考方案1】:

如果你不需要纯 php 并且你的代码是在 linux 机器上运行的,那么

exec('uncompress [-cfv] [file...]');

或者一个

exec('unzip filename.zip -d destination');

将提取文件并使其可用于 php。 当然,您需要检查扩展名(zip、tar 等)才能调用正确的命令

【讨论】:

是的,为了未来的安全问题和兼容性,我绝对想避免 exec() 或任何其他形式的“炮轰”。我绝对可以构建代码来检测和提取这些档案、压缩文件和压缩档案,但我只是想知道是否已经有推荐的可靠解决方案。如果它不存在,也许我会构建它并开源它?我经常发现,当我尝试构建这样的东西时,我后来意识到已经有一个更好的解决方案可以使用。 :) 这绝对是有道理的,我希望你能找到或构建那个解决方案【参考方案2】:

所以,在继续研究这个问题时,我最终在谷歌搜索结果中看到了我自己的(这个)SO 问题,这让我很恼火。所以以防万一有人偶然发现这个寻找一个好的解决方案,我已经通过搜索 https://packagist.org/search/?q=archive 找到了一对(去图):

这里有一些看起来很有希望的。

wapmorgan/UnifiedArchive:

wapmorgan/UnifiedArchive (packagist)

wapmorgan/UnifiedArchive (github source)

特点(乍一看):

只有一个要求pear/archive_tar(其中包括几个 更多实用程序类也来自 pear)。 它会尝试为您检测文件类型,因此无需您自己进行检测。

炼金术/zippy:

alchemy/zippy (packagist)

alchemy-fr/Zippy (github source)

特点(乍一看):

代码看起来设计得非常好。 似乎以某种方式与 Laravel 和 guzzle\guzzle(流行的 php http 客户端)集成,因此这对某些人来说可能是一个优势。

zetacomponents/存档

zetacomponents/Archive (packagist)

zetacomponents/Archive (github source)

特点(乍一看):

似乎是一个纯php实现?如果是这样,那就太棒了。 最后一次更新是 15 天前,所以它是我提到的三个中最活跃的。 似乎由一个组织而不是一个人维护。 它在 packagist 上的下载量迄今为止最多(搜索“存档”时),虽然我还没有玩过它,但这通常是一个好兆头。

免责声明:在撰写本文时,我只实际尝试过wapmorgan/UnifiedArchive,到目前为止,这正是我所寻找的。​​p>

无论如何,我希望这可以帮助任何可能偶然发现这个问题的人。

【讨论】:

以上是关于使用 PHP,我如何识别(如果适用,解压缩)并从 .tar、.gz、.tar.gz、.zip 文件中提取文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何解压缩txt.gz文件并使用php存储到数据库中

Swift解压缩zip文件并从Gmail API的base64数据中找到xml文件

如何在php中解压缩zip文件[重复]

如何在 PHP 中解压缩二进制字符串?

使用 php 解压缩压缩文件

JavaScript字符串压缩+ PHP解压缩[关闭]