Lorsque vous utilisez PHP pour traiter les fichiers compressés ZIP, zip_read () est une fonction commune qui lit les entrées dans les fichiers compressés un par un. Cependant, dans les applications pratiques, de nombreux développeurs sont sujets à des erreurs lors de l'utilisation de cette fonction dans des boucles, ce qui entraîne une lecture ratée ou une logique incorrecte. Cet article expliquera en détail comment utiliser correctement zip_read () pour lire tous les fichiers dans un package compressé.
PHP fournit un ensemble de fonctions liées aux opérations de fichiers ZIP, telles que zip_open () , zip_read () et zip_entry_read () . Où, zip_read () est utilisé pour lire à son tour les entrées de la ressource de fichier zip ouvert.
Une structure de code typique pour la lecture du contenu du fichier compressé est la suivante:
<code> $ zip = zip_open ("example.zip"); if (is_resource ($ zip)) {while ($ entry = zip_read ($ zip)) {echo "name:". zip_entry_name ($ entrée). "\ n"; if (zip_entry_open ($ zip, $ entrée, "r")) {$ contente = zip_entry_read ($ entrée, zip_entry_filesize ($ entrée)); Echo "Contenu:". $ Contenu. "\ n"; zip_entry_close ($ entrée); }} zip_close ($ zip); } else {echo "ne peut pas ouvrir le fichier zip"; } </code>Dans le code ci-dessus, zip_open () ouvre le package compressé et zip_read () lit les entrées une par une dans la boucle while jusqu'à ce qu'il n'y ait plus d'entrée.
zip_read () n'est pas appelé en permanence dans la boucle
Certains développeurs pensent à tort qu'ils peuvent lire toutes les entrées en même temps, ou essayer d'utiliser la structure FOREAC pour manipuler zip_read () , ce qui n'est pas possible. zip_read () est une fonction de lecture séquentielle qui doit être placée dans une boucle de temps pour itérer tout correctement.
Entrée ou fichier zip non fermé
J'ai oublié d'appeler zip_entry_close () et zip_close () peut entraîner une fuite de ressources, en particulier lorsqu'il s'agit de fichiers volumineux ou de plusieurs packages ZIP.
Les problèmes d'encodage non gérés des fichiers dans les packages compressés
Si le fichier zip contient un nom de fichier codé non UTF-8, il peut faire afficher le code brouillé zip_entry_name () . Vous pouvez utiliser mb_convert_encoding () pour transcoder:
<code> $ filename = mb_convert_encoding (zip_entry_name ($ entrée), "utf-8", "cp936"); </code>Supposons que nous ayons un fichier zip téléchargé, nous voulons décompresser et enregistrer tous les fichiers sur les téléchargements locaux / répertoire:
<code> $ zip = zip_open ($ _ fichiers ['file'] ['tmp_name']); if (is_resource ($ zip)) {while ($ entry = zip_read ($ zip)) {$ name = zip_entry_name ($ entrée); $ SAVE_PATH = "Uploads /". Basename ($ name); if (zip_entry_open($zip, $entry, "r")) {
$contents = zip_entry_read($entry, zip_entry_filesize($entry));
file_put_contents($save_path, $contents);
zip_entry_close($entry);
}
}
zip_close($zip);
echo "La décompression est complète";
} autre {
Echo "Le fichier téléchargé ne peut pas être ouvert";
}
</code>
Lors du déploiement en ligne, n'oubliez pas de vérifier le chemin, les autorisations et de le gérer en toute sécurité pour empêcher les attaques de traversée de travers (traversée du répertoire).
Si vous ne savez pas si zip_read () renvoie correctement l'entrée, vous pouvez ajouter une instruction de débogage:
<code> var_dump ($ entrée); </code>De plus, vous pouvez également imprimer le nom de fichier pour confirmer le contenu analysé:
<code> Echo "Fichier de lecture:". zip_entry_name ($ entrée). "\ n"; </code>Lorsque vous lisez des fichiers Zip à l'aide de zip_read () en PHP, assurez-vous de faire attention aux points suivants:
Utiliser while ($ entry = zip_read ($ zip)) Loop;
Utilisez zip_entry_open () et zip_entry_close () après chaque lecture;
Enfin, appelez zip_close () pour fermer la ressource;
Faites attention aux problèmes d'encodage du nom de fichier et de sécurité des répertoires.