Lors du traitement des fichiers compressés ZIP dans PHP, la fonction ZIP_READ () peut nous aider à lire le contenu dans le package compressé un par un. Avec la fonction scandir () pour les opérations de dossiers récursives, nous pouvons facilement implémenter une fonction de décompression automatique des fichiers ZIP côté serveur et de conserver sa structure de répertoire. Cet article présentera en détail comment construire de tels scripts à travers ces deux fonctions.
Assurez-vous que votre environnement PHP a une extension ZIP activée. S'il n'est pas activé, vous pouvez modifier le fichier php.ini , trouvez la ligne de configuration suivante et l'incomment:
extension=zip
Redémarrez ensuite votre serveur Web.
Ouvrir le fichier zip;
Itérer à travers chaque entrée du zip;
Déterminer si une entrée est un répertoire ou un fichier;
Utilisez Scandir () pour créer des structures de répertoire récursives avec des fonctions personnalisées;
Écrivez des fichiers dans Zip sur le chemin de destination.
<?php
function createDirRecursive($path) {
if (!is_dir($path)) {
mkdir($path, 0777, true);
}
}
function unzipWithStructure($zipFilePath, $destination) {
$zip = zip_open($zipFilePath);
if (is_resource($zip)) {
while ($zip_entry = zip_read($zip)) {
$entryName = zip_entry_name($zip_entry);
$fullPath = $destination . '/' . $entryName;
// Si c'est un répertoire,Créer
if (substr($entryName, -1) === '/') {
createDirRecursive($fullPath);
} else {
// Assurez-vous que le répertoire où le fichier existe
$dirPath = dirname($fullPath);
createDirRecursive($dirPath);
if (zip_entry_open($zip, $zip_entry)) {
$fileContent = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
file_put_contents($fullPath, $fileContent);
zip_entry_close($zip_entry);
}
}
}
zip_close($zip);
} else {
echo "Impossible d'ouvrirZIPdocument: $zipFilePath";
}
}
// Exemple d'utilisation
$zipPath = '/var/www/html/uploads/sample.zip';
$extractTo = '/var/www/html/extracted';
// Appelez la fonction pour décompresser
unzipWithStructure($zipPath, $extractTo);
?>
Utilisez Scandir () pour vérifier davantage que la structure du répertoire cible est créée correctement. Par exemple:
function listAllFiles($dir) {
$files = scandir($dir);
foreach ($files as $file) {
if ($file === '.' || $file === '..') continue;
$path = $dir . '/' . $file;
if (is_dir($path)) {
echo "Table des matières: $path\n";
listAllFiles($path);
} else {
echo "document: $path\n";
}
}
}
listAllFiles('/var/www/html/extracted');
Après avoir exécuté le code ci-dessus, vous pouvez publier tous les fichiers et dossiers décompressés pour un débogage et une vérification faciles.
Tous les chemins doivent utiliser des chemins absolus pour éviter les autorisations ou les erreurs de chemin;
Dans un environnement de production, faites attention à la source du fichier zip pour empêcher les attaques de traversée de répertoire (par exemple, Zip contient ../../ );
Le chemin peut être normalisé en combinaison avec RealPath () ;
Si le fichier est grand, il est recommandé d'utiliser la lecture en streaming pour empêcher le débordement de la mémoire.
Ce script convient pour télécharger des fichiers compressés et les décompresser automatiquement. Par exemple, si l'utilisateur télécharge un fichier zip contenant une structure de répertoire multicouche sur m66.net/upload , l'arrière-plan peut restaurer directement la structure complète dans le répertoire m66.net/storage via le script ci-dessus, et traiter davantage le contenu, tel que la génération de miniatures, la numérisation des virus ou la fabrication de sauvegardes.
De cette façon, le flux de travail du téléchargement de contenu et de l'initialisation des fichiers peut être considérablement simplifié et l'efficacité de développement peut être améliorée.