Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 解压缩Zip中的目录_Php_Directory_Zip_Extract_Archive - Fatal编程技术网

Php 解压缩Zip中的目录

Php 解压缩Zip中的目录,php,directory,zip,extract,archive,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'; } 这很好,但有一个问

我正在编写一个脚本,将zip存档中的文件解压缩到脚本所在的目录中

这是我的密码:

$zip = new ZipArchive;
if ($zip->open('latest.zip') === TRUE) {
    $zip->extractTo('.');
    $zip->close();
    unlink('installer.php');
    echo 'it works!';
} else {
    echo 'failed';
}
这很好,但有一个问题。拉链上还有一层。(zip/directory/files)提取类似于此目录/文件的内容,而不仅仅是文件

有没有办法去掉这个额外的层

谢谢你的帮助


Joel Drapper

为了防止任何文件被覆盖,您可能需要先将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>/"
}

谢谢你的帮助!我不需要创建另一个目录,因为我知道脚本所在的目录将是空的。我只想将zip(和随机无用目录层)中的文件解压缩到脚本所在的同一文件夹中。允许用户上载zip文件并随后解压缩时,请小心。你很容易受到拉链炸弹的攻击: