ZIP file not being created, but no error gets triggered

老子叫甜甜 提交于 2019-12-10 03:15:07

问题


I'm using 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');

I can see the list of files, but in the end I cannot find the zip file that's supposed to be created. And I get no errors / exceptions from ZipArchive...

edit:

I've added print $zip->getStatusString(); after $zip->close();

and it prints :Can't open file: Permission denied". What does that mean? I know for sure every directory is writable, bc I can create new files with PHP inside them...

edit 2:

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

it prints that, so the dir is writable. Feels like I'm in the twilight zone...


回答1:


Two Comments From php.net

If you're adding multiple files to a zip and your $zip->close() call is returning FALSE, ensure that all the files you added actually exist. Apparently $zip->addFile() returns TRUE even if the file doesn't actually exist. It's a good idea to check each file with file_exists() or is_readable() before calling $zip->addFile() on it.

and

Don't forget to check the zip isn't empty, folks - otherwise the zip won't be created at all, and the server will issue no warning!




回答2:


Sounds like you have a permission issue, either with writing to the zip file, or reading the files it is zipping.

I would use a combination of file_exists, is_readable, and is_writable to figure out which of these is causing the problem.

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');



回答3:


Make sure that:

  • All files added actually exist (check each file with file_exists() and is_readable() before calling $zip->addFile()).
  • When iterating folder, exclude . and ...
  • There is at least one file to zip ($zip['numFiles'] > 0).
  • Calling $zip->close() returns TRUE.


来源:https://stackoverflow.com/questions/12895089/zip-file-not-being-created-but-no-error-gets-triggered

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!