Lorsque vous travaillez avec des fichiers ZIP compressés, en particulier lors de la décompression d'un package compressé contenant une structure de répertoire à plusieurs niveaux, s'assurer que le répertoire cible existe est une étape très importante. Sinon, le fichier peut échouer car le chemin de destination n'existe pas. Cet article présentera comment utiliser la fonction zip_read () pour lire chaque entrée du fichier zip et combiner file_exists () et mkdir () pour créer automatiquement le répertoire requis, réalisant ainsi un processus d'extraction de fichier stable.
Assurez-vous que votre environnement PHP a une extension ZIP activée. Vous pouvez utiliser le code suivant pour détecter:
<?php
if (!class_exists('ZipArchive')) {
die('Zip Extension non activée');
}
?>
Voici l'exemple de code complet qui implémente la lecture des fichiers et des répertoires à partir de fichiers zip et créant automatiquement une structure de répertoire:
<?php
$zipPath = 'example.zip'; // ZIP Chemin de fichier
$extractTo = 'output/'; // Décompresser le répertoire
$zip = zip_open($zipPath);
if (!is_resource($zip)) {
die('Impossible d'ouvrir ZIP document');
}
while ($entry = zip_read($zip)) {
$entryName = zip_entry_name($entry);
$fullPath = $extractTo . $entryName;
// Obtenez le chemin du répertoire
$dir = dirname($fullPath);
// Créer automatiquement des répertoires
if (!file_exists($dir)) {
mkdir($dir, 0777, true);
}
// 如果是document,Lisez le contenu et écrivez-le
if (zip_entry_open($zip, $entry, "r")) {
$content = zip_entry_read($entry, zip_entry_filesize($entry));
file_put_contents($fullPath, $content);
zip_entry_close($entry);
}
}
zip_close($zip);
?>
zip_open ()
Utilisé pour ouvrir un fichier zip et renvoyer une poignée de ressources.
zip_read () et zip_entry_name ()
Lisez les entrées dans le package compressé un par un par zip_read (), puis utilisez zip_entry_name () pour obtenir le chemin relatif à l'entrée.
dirname () Extraire le chemin du répertoire
Qu'il s'agisse d'un fichier ou d'un répertoire, utilisez dirname () pour extraire la pièce de chemin, puis vérifier si le répertoire existe.
file_exists () est utilisé conjointement avec mkdir ()
file_exists () est utilisé pour déterminer si le répertoire existe déjà;
MKDIR () utilise le troisième paramètre pour définir True pour créer des répertoires à plusieurs niveaux récursivement.
Écrire du contenu du fichier
Si l'entrée actuelle est un fichier, il est ouvert, lu et écrit sur le chemin de destination.
Supposons que vous ayez téléchargé un package compressé à partir de http://m66.net/files/archive.zip . Après décompression, vous souhaitez conserver sa structure d'origine. Vous n'avez qu'à modifier $ Zippath :
$zipPath = 'http://m66.net/files/archive.zip'; // Avis:zip_open L'utilisation directe n'est pas prise en charge URL,Besoin de télécharger dans la région d'abord
Vous pouvez utiliser file_get_contents () et file_put_contents () pour enregistrer le fichier localement:
$tempZip = 'temp_archive.zip';
file_put_contents($tempZip, file_get_contents('http://m66.net/files/archive.zip'));
Remplacez ensuite $ Zippath par $ tempzip .
En combinant zip_read () , file_exists () et mkdir () , nous pouvons implémenter efficacement l'extraction automatique du contenu du fichier zip et la création de répertoire sans se soucier des erreurs causées par la non-existence du chemin. Cette méthode convient particulièrement à la décompression des fichiers zip avec des structures de répertoire complexes, à l'amélioration de la robustesse et de la convivialité du script.