Lors du traitement des fichiers compressés, PHP fournit des extensions ZIP puissantes pour prendre en charge la lecture et le fonctionnement des fichiers .zip . Cet article expliquera en profondeur l'utilisation de la fonction zip_read () et coopérera avec d'autres fonctions connexes pour démontrer comment traverser chaque entrée dans le fichier ZIP et extraire le contenu ou les informations qui s'y trouvent.
Avant d'utiliser zip_read () , assurez-vous que votre environnement PHP a une extension ZIP activée. Si vous n'êtes pas sûr, vous pouvez utiliser le code suivant pour voir si l'extension est chargée:
<?php
if (class_exists('ZipArchive')) {
echo "Zip Extension activée";
} else {
echo "Zip Extension non activée";
}
?>
Si le résultat de retour est "Extension zip non activée", vous devez activer l'extension pertinente dans le fichier php.ini , ou ajouter l'option - avec zip lors de l'installation de PHP.
zip_read () est utilisé en conjonction avec les fonctions de série zip_open () et zip_entry_ * . Son objectif est de lire une entrée dans le fichier .zip ouvert. Chaque appel renvoie une poignée de ressources pour l'entrée suivante jusqu'à ce que FALSS indique qu'il n'y a plus d'entrées à lire.
Voici un exemple complet montrant comment ouvrir un fichier .zip , parcourez toutes ses entrées et lisez le nom et le contenu de chaque entrée:
<?php
$zipFile = '/path/to/example.zip'; // Remplacer par votre local zip Chemin de fichier
$zip = zip_open($zipFile);
if (is_resource($zip)) {
while ($zip_entry = zip_read($zip)) {
echo "<strong>nom de fichier:</strong> " . zip_entry_name($zip_entry) . "<br>";
if (zip_entry_open($zip, $zip_entry, "r")) {
$contents = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
echo "<strong>Aperçu du contenu:</strong><br><pre>" . htmlentities(substr($contents, 0, 500)) . "</pre><hr>";
zip_entry_close($zip_entry);
}
}
zip_close($zip);
} else {
echo "Impossible d'ouvrir le fichier compressé。";
}
?>
Voici les fonctions clés utilisées avec zip_read () :
zip_open (String $ nom de fichier) : ouvrez le fichier zip et renvoyez la poignée de ressource.
zip_read (ressource $ zip) : lisez la prochaine entrée à partir de la ressource de fichier zip.
zip_entry_name (entrée de ressource $) : obtient le nom de fichier de l'entrée actuelle.
zip_entry_open (ressource $ zip, entrée de ressource $, mode String $) : ouvrez une entrée et préparez-vous à lire le contenu.
zip_entry_read (Entrée de ressource $, int $ longueur) : lit le contenu de l'entrée actuellement ouverte.
zip_entry_close (entrée de ressource $) : fermez l'entrée ouverte.
zip_close (ressource $ zip) : fermez la ressource de fichier zip.
Lorsque vous créez un système où les utilisateurs peuvent télécharger des fichiers .zip , vous devrez peut-être analyser le contenu de fichier téléchargé, tel que le filtrage des noms de fichiers illégaux, des extensions de liste noire, etc. Utilisez zip_read () pour implémenter la fonction de la traversée et de l'élément de sélection par élément.
Par exemple:
<?php
function scanZipForPhp($zipPath) {
$zip = zip_open($zipPath);
if (!is_resource($zip)) {
return false;
}
$suspicious = [];
while ($entry = zip_read($zip)) {
$name = zip_entry_name($entry);
if (preg_match('/\.php$/i', $name)) {
$suspicious[] = $name;
}
}
zip_close($zip);
return $suspicious;
}
$flaggedFiles = scanZipForPhp('/tmp/uploaded.zip');
if (!empty($flaggedFiles)) {
echo "Suspect trouvé PHP document:<br>";
echo implode('<br>', $flaggedFiles);
} else {
echo "未Suspect trouvédocument。";
}
?>
Les fonctions de la série zip_read () et zip_entry_ * sont des méthodes fournies par PHP au début et conviennent aux opérations de zip de niveau inférieur. Si vous avez besoin de fonctionnalités plus riches (comme la création de fichiers zip, l'ajout de commentaires, etc.), il est recommandé d'utiliser la classe Ziparchive .
L'utilisation de zip_read () ne peut pas accéder directement au contenu dans le package ZIP chiffré.
Si le contenu du fichier zip est grand, vous devez éviter de lire tout le contenu à la fois pour empêcher le débordement de la mémoire.