Position actuelle: Accueil> Derniers articles> Comment créer de manière récursive la structure du dossier cible et implémenter la décompression des fichiers à l'aide de la fonction ZIP_READ de PHP combinée avec la fonction scandir ()?

Comment créer de manière récursive la structure du dossier cible et implémenter la décompression des fichiers à l'aide de la fonction ZIP_READ de PHP combinée avec la fonction scandir ()?

M66 2025-06-15

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.

1. Préparation environnementale

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.

2. Idées de base

  1. Ouvrir le fichier zip;

  2. Itérer à travers chaque entrée du zip;

  3. Déterminer si une entrée est un répertoire ou un fichier;

  4. Utilisez Scandir () pour créer des structures de répertoire récursives avec des fonctions personnalisées;

  5. Écrivez des fichiers dans Zip sur le chemin de destination.

3. Implémentation du code

 <?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&#39;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&#39;ouvrirZIPdocument: $zipFilePath";
    }
}

// Exemple d&#39;utilisation
$zipPath = '/var/www/html/uploads/sample.zip';
$extractTo = '/var/www/html/extracted';

// Appelez la fonction pour décompresser
unzipWithStructure($zipPath, $extractTo);
?>

4. Traversion et vérification du répertoire

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.

5. Choses à noter

  • 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.

6. Scénarios d'application

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.