zip中提取特定文件(包括子目录)

use*_*277 5 php ziparchive php-7

我想从zip文件中仅提取图像,但我也希望它提取子文件夹中的图像.如何根据我的代码实现这一点.注意:我不是想在这里保留目录结构,只是想要提取zip中找到的任何图像.

//extract files in zip
for ($i = 0; $i < $zip->numFiles; $i++) {
    $file_name = $zip->getNameIndex($i);
    $file_info = pathinfo($file_name);
    //if ( substr( $file_name, -1 ) == '/' ) continue; // skip directories - need to improve
    if (in_array($file_info['extension'], $this->config->getValidExtensions())) {
        //extract only images
        copy("zip://" . $zip_path . "#" . $file_name, $this->tmp_dir . '/images/' . $file_info['basename']);
    }
}
$zip->close();
Run Code Online (Sandbox Code Playgroud)

编辑

我的代码工作正常,我需要知道的是如何使ziparchive进入子目录

Rus*_*nov 2

你的代码是正确的。我用a.zip文件创建了a/b/c.pngd.png

$ mkdir -p a/b
$ zip -r a.zip d.png a
  adding: d.png (deflated 4%)
  adding: a/ (stored 0%)
  adding: a/b/ (stored 0%)
  adding: a/b/c.png (deflated 8%)

$ unzip -l a.zip 
Archive:  a.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
   122280  11-05-2016 14:45   d.png
        0  11-05-2016 14:44   a/
        0  11-05-2016 14:44   a/b/
    36512  11-05-2016 14:44   a/b/c.png
---------                     -------
   158792                     4 files
Run Code Online (Sandbox Code Playgroud)

代码将d.pngc.png提取a.zip到目标目录中:

$arch_filename = 'a.zip';
$dest_dir = './dest';
if (!is_dir($dest_dir)) {
  if (!mkdir($dest_dir, 0755, true))
    die("failed to make directory $dest_dir\n");
}

$zip = new ZipArchive;
if (!$zip->open($arch_filename))
  die("failed to open $arch_filename");

for ($i = 0; $i < $zip->numFiles; ++$i) {
  $path = $zip->getNameIndex($i);
  $ext = pathinfo($path, PATHINFO_EXTENSION);
  if (!preg_match('/(?:jpg|png)/i', $ext))
    continue;
  $dest_basename = pathinfo($path, PATHINFO_BASENAME);
  echo $path, PHP_EOL;
  copy("zip://{$arch_filename}#{$path}", "$dest_dir/{$dest_basename}");
}

$zip->close();
Run Code Online (Sandbox Code Playgroud)

测试

$arch_filename = 'a.zip';
$dest_dir = './dest';
if (!is_dir($dest_dir)) {
  if (!mkdir($dest_dir, 0755, true))
    die("failed to make directory $dest_dir\n");
}

$zip = new ZipArchive;
if (!$zip->open($arch_filename))
  die("failed to open $arch_filename");

for ($i = 0; $i < $zip->numFiles; ++$i) {
  $path = $zip->getNameIndex($i);
  $ext = pathinfo($path, PATHINFO_EXTENSION);
  if (!preg_match('/(?:jpg|png)/i', $ext))
    continue;
  $dest_basename = pathinfo($path, PATHINFO_BASENAME);
  echo $path, PHP_EOL;
  copy("zip://{$arch_filename}#{$path}", "$dest_dir/{$dest_basename}");
}

$zip->close();
Run Code Online (Sandbox Code Playgroud)

所以代码是正确的,问题一定出在其他地方。