使用 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?

我知道'Phar'PharData存在,但是到目前为止,我对它们提供的方法遇到了一些麻烦。 在确定使用哪种Phar*::method()来尝试提取存档并处理它包含的文件之前,我仍然必须通过任何方式检测 mime 类型/文件类型。

是否有一个我可以包含的"简单按钮"类(也许是通过作曲家提供的一些包)在非常高的级别上处理这个问题? 还是到目前为止我未能正确使用Phar和朋友或需要重新 RTM?

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

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

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

我希望我写它的方式是有意义的。 如果有人已经基本上弄清楚了所有这些,我试图避免在这里为迷你项目重新发明轮子。

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

以下是其中一些看起来很有希望的。

wapmorgan/UnifiedArchive:

  • wapmorgan/UnifiedArchive (packagist)
  • wapmorgan/UnifiedArchive (github source)

    特点(乍一看):

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

炼金术/炼金术:

  • 炼金术/齐皮(包装师)
  • alchemy-fr/Zippy (github source)

    特点(乍一看):

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

zetacomponents/archive

  • zetacomponents/Archive (packagist)
  • zetacomponents/Archive (github source)

    特点(乍一看):

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

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

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

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

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

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

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