Avertissement sur ZipArchive Fermer
Je suis en train de résoudre un problème dans une auto-zip script pour certaines images, que j'ai écrit il y a longtemps et cela a fonctionné jusqu'à maintenant. Tout semble parfait jusqu'à ce $zip->close();
qui donne les éléments suivants:
<b>Warning</b>: ZipArchive::close(): Read error: No such file or directory in <b></b> on line <b>287</b><br />
J'ai lu les docs et certains forums et trouvé que cela pourrait se produire dans l'un des scénarios suivants:
- Si aucun des fichiers sont ajoutés à la fermeture à glissière, depuis PHP 5.6—ce qui pourrait être une explication probable depuis que j'ai récemment mis à jour vers PHP 5.6. Cependant:
- Je vérifie que chaque fichier existe avant de l'ajouter
- J'ai essayé d'ajouter un mannequin non-fichier texte vide pour le zip. Ajouter au zip retourne vrai, comme le fait
file_exists()
sur le fichier - Quand je écho
$zip->numFiles
et il donne un certain nombre d'au moins 1 (lorsque le zip n'a pas de fichiers à l'exception de la dummy)
- Si le répertoire où le zip doit être écrite n'existe pas ou n'a pas le droit d'autorisations: Ce ne semble pas être le cas, mais juste pour être sûr, j'ai écrit un fichier texte dans le même dossier dans le même script et il n'y a pas de problème
- Si il y a un problème d'écriture pour le répertoire temp. C'est un peu plus difficile de vérifier cela, mais j'ai un script d'upload dans le même système qui fonctionne, et j'ai fait en sorte qu'il n'existe pas de problèmes d'espace disque etc.
Voici le code correspondant. Certaines variables sont définis à l'avance. Notez que j'écris chaque problème à mon journal, et ce script ne génère pas d'entrées de!
$zip_file = 'Project'.$project_id.'.zip';
$zip = new ZipArchive;
if ($zip_result = $zip->open($zip_path.'/'.$zip_file, ZIPARCHIVE::CREATE) !== true) {
echo 'Error creating zip for project: '.$project_id.'. Error code: '.$zip_result;
help::debugLog('Error creating zip for project: '.$project_id.'. Error code: '.$zip_result);
return false;
}
$file_list = array();
foreach ($item_thumbs as $item)
{
$full_thumb_path = $thumb_dir.'/'.$item['thumb'];
if (file_exists($full_thumb_path) and $item['thumb'])
{
$file_added = $zip->addFile($full_thumb_path, basename($item['thumb']));
if (!$file_added)
help::debugLog('Failed to add item thumb to project zip. Project: '.$project_id.', file name: '.$item['thumb']);
else
$file_list[] = $item['thumb'];
}
elseif ($item['thumb']) /* If thumb indicated in DB doesn't exist in file system */
help::debugLog('Item thumb file '.$item['thumb'].' from item: '.$item['id'].' is missing from its indended location: '.$full_thumb_path);
}
/* Added 2016-05-18 -- creates dummy file for the zip listing its contents, important in case zip is empty */
$file_list_path = $zip_path.'/file_list.txt';
if (!($file_list_file = fopen($file_list_path, 'w+')))
help::debugLog('Failed to create list file (intended for zip) for project: '.$project_id);
fwrite($file_list_file, "File list:\n");
fwrite($file_list_file, implode("\n", $file_list));
if (file_exists($file_list_path))
{
fclose($file_list_file);
if (!$zip->addFile($file_list_path))
help::debugLog('Failed to add list file to project zip for project: '.$project_id);
unlink($file_list_path);
}
else
help::debugLog('Failed to create list file (intended for zip) for project: '.$project_id);
$zip->close(); //line 287
OriginalL'auteur Ynhockey | 2016-05-18
Vous devez vous connecter pour publier un commentaire.
S'avère la solution était très simple, et c'est effectivement mentionnée dans les docs (php.net), dans l'un des commentaires:
Donc, à partir de mon code ci-dessus, le "mannequin" fichier texte est supprimé avant la fermeture à glissière est fermée, nécessairement fait-il que le fichier n'existe pas au moment de la fermeture éclair est créé.
J'avais de bonnes raisons de croire que le zip a été créé dans un emplacement temporaire, et seulement déplacé à l'emplacement final sur
close()
. S'avère que ce n'est pas le cas.J'ai déplacé le $zip->close() pour un moment avant que le fichier texte est supprimé.
OriginalL'auteur Ynhockey
Vérifier la valeur de "$full_thumb_path" dans la ligne
La valeur doit être un chemin d'accès au fichier et ne doit pas être un chemin d'accès au répertoire.
J'ai juste eu cette au cours d'une phing construire. Le message: [Erreur PHP] ZipArchive::close(): erreur de Lecture: Est un répertoire --> la réponse est simple, c'est juste parce qu'il y a quelques lien symbolique dans l'arborescence de fichiers
OriginalL'auteur Daniel Qi