9

我正在使用 ZipArchive:

function zip_dir($source, $target){

    $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST);

    $zip = new \ZipArchive();
    if($zip->open($target, \ZipArchive::CREATE) !== true)
      exit('cannot create zip');

    foreach($iterator as $file){
      $zip->addFile($file);
      print $file . '<br>';
    }


    $zip->close();
    return $target;
}


zip_dir(__DIR__ . '/test/', __DIR__ . '/testarchive.zip');

我可以看到文件列表,但最后我找不到应该创建的 zip 文件。而且我没有收到 ZipArchive 的错误/异常...

编辑:

我添加print $zip->getStatusString();$zip->close();

它打印:无法打开文件:权限被拒绝”。这是什么意思?我确定每个目录都是可写的,因为我可以在其中创建带有 PHP 的新文件......

编辑2:

if(is_writable(dirname($target)))
  print 'target dir is writable...';

它打印出来,所以目录是可写的。感觉自己在暮光之城...

4

3 回答 3

10

来自 php.net 的两条评论

如果您将多个文件添加到一个 zip 并且您的$zip->close()调用返回 FALSE,请确保您添加的所有文件确实存在。$zip->addFile()即使文件实际上不存在,显然也会返回 TRUE。在调用每个文件时file_exists()或之前检查每个文件是个好主意。is_readable()$zip->addFile()

伙计们,不要忘记检查 zip 是否为空 - 否则根本不会创建 zip,并且服务器不会发出警告!

于 2012-10-15T12:07:22.263 回答
6

听起来您有权限问题,要么是写入 zip 文件,要么是读取它正在压缩的文件。

我会使用 、 和 的组合file_existsis_readable找出is_writable导致问题的原因。

function zip_dir($source, $target){

    $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST);

    $zip = new \ZipArchive();
    if($zip->open($target, \ZipArchive::CREATE) !== true)
      exit('cannot create zip');

    foreach($iterator as $file){
      if (!file_exists($file)) { die($file.' does not exist'); }
      if (!is_readable($file)) { die($file.' not readable'); }
      $zip->addFile($file);
      print $file . '<br>';
    }


    $zip->close();
    return $target;
}

if (!is_writable(__DIR__)) { die('directory not writable'); }
zip_dir(__DIR__ . '/test/', __DIR__ . '/testarchive.zip');
于 2012-10-15T15:19:49.713 回答
1

确保:

  • 添加的所有文件实际上都存在(在调用之前file_exists()检查每个文件)。is_readable()$zip->addFile()
  • 迭代文件夹时,排除....
  • 至少有一个要压缩的文件 ( $zip['numFiles'] > 0)。
  • 调用$zip->close()返回TRUE
于 2015-01-21T08:57:31.990 回答