Aktueller Standort: Startseite> Neueste Artikel> Wie können Sie mit der Funktion zip_read () mit der Funktion zip_read () zip-komprimierte Pakete mit mehrschichtigen verschachtelten Verzeichnissen effizient verarbeiten?

Wie können Sie mit der Funktion zip_read () mit der Funktion zip_read () zip-komprimierte Pakete mit mehrschichtigen verschachtelten Verzeichnissen effizient verarbeiten?

M66 2025-06-15

Die Arbeit mit ZIP -Dateien in PHP ist eine gemeinsame Aufgabe, insbesondere wenn wir Inhalte extrahieren oder Dateistrukturen aus einem komprimierten Paket lesen müssen. Die Funktion zip_read () ist eine weitere Möglichkeit, Zip -Dateien außerhalb der Ziparchive -Klasse zu verarbeiten. Es wird oft mit Funktionen wie zip_open () und zip_entry_read () verwendet. Obwohl diese Funktionen niedrig sind, sind sie für Entwickler, die ein tieferes Verständnis der ZIP-Dateistruktur gewinnen möchten, immer noch von großer Bedeutung, insbesondere wenn sie mit ZIP-Dateien mit mehrschichtigen verschachtelten Verzeichnissen zu tun haben.

Grundnutzungsmethode

Zunächst müssen wir die ZIP -Datei mit zip_open () öffnen und jeden Eintrag mit ZIP_READ () durchlaufen. Das Folgende ist die Grundstruktur:

 $zip = zip_open("nested_directories.zip");

if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        $entryName = zip_entry_name($entry);
        echo "Entry: $entryName\n";
    }
    zip_close($zip);
}

Dieser Code -Snippet kann alle Einträge (einschließlich Verzeichnisse und Dateien) in einer ZIP -Datei auflisten. Die Auflistung reicht jedoch nicht aus. Wir müssen uns tiefer mit verschachtelten Strukturen befassen.

Identifizieren Sie verschachtelte Verzeichnisstrukturen

Verschachtelte Verzeichnisse in ZIP-Dateien haben keine "baumartige" Struktur wie echte Dateisysteme. Jedes Verzeichnis oder jede Datei wird beispielsweise als Pfadzeichenfolge ausgedrückt:

 photos/
photos/vacation/
photos/vacation/beach.jpg
documents/report.docx

Daher müssen wir die Tiefe des Dateipfads basierend auf / beurteilen. Jede Schicht kann durch einfaches exploit () analysiert werden:

 $depth = substr_count($entryName, '/');

Dies ist sehr nützlich, wenn wir bestimmte Operationen gemäß der Verzeichnisebene ausführen müssen.

Dateien extrahieren und die Verzeichnisstruktur erhalten

Um den Inhalt der ZIP -Datei in ein angegebenes Verzeichnis zu extrahieren und seine Verzeichnisstruktur zu bewahren, können wir sie in Kombination mit zip_entry_read () und File_put_Contents () tun. Wie unten gezeigt:

 $zip = zip_open("nested_directories.zip");

$extractPath = "extracted/";

if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        if (zip_entry_open($zip, $entry, "r")) {
            $entryName = zip_entry_name($entry);
            $fullPath = $extractPath . $entryName;

            // Wenn es ein Verzeichnis ist,Stellen Sie sicher, dass Sie erstellen
            if (substr($entryName, -1) === '/') {
                if (!is_dir($fullPath)) {
                    mkdir($fullPath, 0755, true);
                }
            } else {
                // Wenn es sich um eine Datei handelt,Stellen Sie sicher, dass das vorherige Verzeichnis existiert
                $dir = dirname($fullPath);
                if (!is_dir($dir)) {
                    mkdir($dir, 0755, true);
                }

                $content = zip_entry_read($entry, zip_entry_filesize($entry));
                file_put_contents($fullPath, $content);
            }

            zip_entry_close($entry);
        }
    }
    zip_close($zip);
}

Der obige Code implementiert die vollständige Funktion verschachtelter Strukturextraktion, verarbeitet die Erstellung und das Schreiben von Verzeichnissen und stellt sicher, dass die ursprüngliche Struktur unverändert bleibt.

Praktische Anwendungsbeispiele

Stellen Sie sich vor, Sie haben eine Website (z. B. https://m66.net/upload ) entwickelt, um die Funktion zum Reißverschluss -Upload bereitzustellen. Die von Benutzern hochgeladene ZIP-Datei kann komplexe, mehrschichtige verschachtelte Verzeichnisse enthalten. Um diese Dateien sicher in ein temporäres Verzeichnis zur weiteren Verarbeitung zu dekomprimieren, können Sie zuerst den Inhalt mit dem obigen Code extrahieren und dann den Zielordner zur Verarbeitung durchqueren.

Um die Schwachstellen für Pfadtravers zu vermeiden (z. B. bösartige Zip einschließlich ../../etc/passwd ), sollten Sie auch die Sicherheitsüberprüfung nach dem Pfadstich durchführen:

 $realBase = realpath($extractPath);
$realUserPath = realpath($fullPath);

if (strpos($realUserPath, $realBase) !== 0) {
    // Illegaler Weg,über etwas springen
    continue;
}

Vorschläge zur Leistungsoptimierung

  1. Vermeiden Sie unnötiges Lesen von Dateien : Verarbeiten Sie nur die erforderlichen Verzeichnisse oder Dateien mit spezifischen Erweiterungen.

  2. Lade auf Bedarf : Verwenden Sie bei großen Dateien nicht zip_entry_read ($ einstieg, zip_entry_filesize ($ ein) gleichzeitig geladen, aber verwenden Sie Streaming -Lesen.

  3. Batch -Betrieb : Wenn der endgültige Vorgang eine Datenbank oder einen externen Dienst beinhaltet, berücksichtigen Sie das Pufferergebnis und senden Sie in Stapel.

Zusammenfassen

Obwohl die Verwendung der Funktion zip_read () zur Verarbeitung von Zip -Dateien nicht so intuitiv wie ziparchive ist, ist dies in einigen Szenarien, in denen die strukturellen Steueranforderungen hoch sind, immer noch sehr praktisch. Durch die Analyse der Pfadfolge können wir mehrschichtige verschachtelte Verzeichnisse verarbeiten und den Inhalt sicher an den serverspezifizierten Pfad extrahieren. Dieser Ansatz kombiniert geeignete Sicherheits- und Leistungsoptimierungsmaßnahmen und bleibt ein leistungsstarkes Instrument zum Erstellen einer komplexen Zip -Datei -Verarbeitungslogik.