php - 提取 Zip 内的目录

标签 php directory zip extract archive

我正在编写脚本以将文件从 zip 存档中提取到脚本所在的目录中。

这是我的代码:

$zip = new ZipArchive;
if ($zip->open('latest.zip') === TRUE) {
    $zip->extractTo('.');
    $zip->close();
    unlink('installer.php');
    echo 'it works!';
} else {
    echo 'failed';
}

这工作正常,但有一个问题。 zipper 包含一个额外的层。 (zip/directory/files) 像这个目录/文件一样提取而不仅仅是文件。

有没有办法去除这个额外的层?

感谢您的帮助!

乔尔·德雷珀

最佳答案

为了防止任何文件被覆盖,您可能需要先将 zip 文件解压到一个目录中。我会创建一个具有随机名称的目录,将 zip 解压缩到该目录中,然后检查是否有任何子目录:

<?php

// Generate random unzip directory to prevent overwriting
// This will generate something like "./unzip<RANDOM SEQUENCE>"
$pathname = './unzip'.time().'/';

if (mkdir($pathname) === TRUE) {

  $zip = new ZipArchive;

  if ($zip->open('latest.zip') === TRUE) {

    $zip->extractTo($pathname);

    // Get subdirectories
    $directories = glob($pathname.'*', GLOB_ONLYDIR);

    if ($directories !== FALSE) {

      foreach($directories as $directory) {

        $dir_handle = opendir($directory);

        while(($filename = readdir($dir_handle)) !== FALSE) {

          // Move all subdirectory contents to "./unzip<RANDOM SEQUENCE>/"
          if (rename($filename, $pathname.basename($filename)) === FALSE) {
            print "Error moving file ($filename) \n";
          }
        }
      }
    }

    // Do whatever you like here, for example:
    unlink($pathname.'installer.php');

  }

  // Clean up your mess by deleting "./unzip<RANDOM SEQUENCE>/"
}

我尚未测试此代码,因此,使用风险自负,而且它可能无法在 Windows 系统上按预期工作。此外,查看我使用的所有功能的文档:

关于php - 提取 Zip 内的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/859396/

相关文章:

javascript - 使用 google 图表 api 和 sql

php - Zend 多个 where

directory - 如何根据远程主机上的现有文件将现有目录添加到 PHPStorm 项目?

C# 对话框选择多个文件和文件夹

Java - 从 jar 中删除 META-INF 不起作用

python - 如何使用 python 提取封闭的 zip

php - 使用相同凭据的两个单独连接是否共享一个线程?

PHP 或 JavaScript : no element found error

windows - 如何创建授予所有人所有权限的目录

java - 如何使用 Java 读取 Winzip 自解压 (exe) zip 文件?