ZIP文件未创建,但未触发任何错误

时间:2012-10-15 11:52:21

标签: php file zip ziparchive

我正在使用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();

并打印:无法打开文件:权限被拒绝“。 那是什么意思?我知道每个目录都是可写的,bc我可以在里面用PHP创建新文件......

编辑2:

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

它打印出来,所以dir是可写的。感觉就像我在暮光之城......

3 个答案:

答案 0 :(得分:8)

来自php.net的两条评论

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

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

答案 1 :(得分:6)

听起来你有一个权限问题,无论是写入zip文件,还是读取它正在压缩的文件。

我会使用file_existsis_readableis_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');

答案 2 :(得分:1)

确保:

  • 实际添加的所有文件都存在(在调用file_exists()之前,请先使用is_readable()$zip->addFile()检查每个文件。)
  • 在迭代文件夹时,排除...
  • 至少有一个要压缩的文件($zip['numFiles'] > 0)。
  • 致电$zip->close()会返回TRUE