问题
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()
andis_readable()
before calling$zip->addFile()
). - When iterating folder, exclude
.
and..
. - There is at least one file to zip (
$zip['numFiles'] > 0
). - Calling
$zip->close()
returnsTRUE
.
来源:https://stackoverflow.com/questions/12895089/zip-file-not-being-created-but-no-error-gets-triggered