Aktueller Standort: Startseite> Neueste Artikel> Warum kann ich keine verschlüsselte Zip -Datei mit ZIP_READ () lesen? Problembeschreibung und Analyse

Warum kann ich keine verschlüsselte Zip -Datei mit ZIP_READ () lesen? Problembeschreibung und Analyse

M66 2025-06-05

In PHP verwenden wir beim Betrieb von Zip -Dateien häufig die Funktion Zip_read () , die zum Teil der Ziparchive -Klasse gehört und hauptsächlich zum Durchqueren und Lesen von Dateieinträgen im ZIP -Paket verwendet wird. Bei der Begegnung einer verschlüsselten ZIP -Datei finden viele Entwickler jedoch, dass das Lesen mit zip_read () fehlschlägt oder einfach nicht auf den verschlüsselten Inhalt zugreifen kann. Warum ist das? Dieser Artikel kombiniert den Zip -Erweiterungsmechanismus von PHP, um die Ursachen dieses Problems und seiner Lösungen im Detail zu analysieren.

1. Problemphänomen

 $zip = zip_open('encrypted.zip');
if ($zip) {
    while ($entry = zip_read($zip)) {
        echo zip_entry_name($entry) . "\n";
        if (zip_entry_open($zip, $entry)) {
            echo zip_entry_read($entry, zip_entry_filesize($entry));
            zip_entry_close($entry);
        }
    }
    zip_close($zip);
}

Der obige Code funktioniert normalerweise beim Lesen einer normalen ZIP -Datei. Bei der Begegnung einer verschlüsselten Zip -Datei treten jedoch häufig die folgenden Probleme auf:

  • ZIP_ENTRY_READ () kann den Dateiinhalt nicht lesen und gibt eine leere Zeichenfolge oder einen Fehler zurück.

  • Es kann nicht einmal zu Dateieinträgen wechseln, die sich als zip_read () manifestiert, die false zurückgibt.

2. Analyse der Ursache Ursache

ZIP_READ () gehört zur alten Schnittstelle der Libzip- Bibliothek von PHP (Low-Level-Operationen basierend auf ZIP-Dateien) und unterstützt die Entschlüsselung verschlüsselter Dateiinhalte nicht nativ. Verschlüsselte ZIP-Dateien (normalerweise kennwortgeschützt) Verwenden Sie die Methode zum Verschlüsseln von Dateidaten, und die Daten werden nicht einfach im Klartext gespeichert.

  • ZIP_READ () kann nur auf Dateieinträge und unverschlüsselte Dateiinhalte in ZIP -Dateien zugreifen.

  • Wenn die ZIP -Datei verschlüsselt ist, muss die ZIP -Erweiterung die entsprechende Entschlüsselungslogik aufrufen, um die Datei korrekt zu lesen, indem das richtige Kennwort angegeben wird.

  • PHPs ZIP_READ () liefert keine Kennwortparameter und unterstützt keine automatische Entschlüsselung.

Kurz gesagt, zip_read () unterstützt das Lesen verschlüsselter Dateien im Design nicht.

3. Richtiger Weg: Verwenden Sie die Funktion der Kennwortentschlüsselung der Ziparchive -Klasse

Die ZIP -Erweiterung von PHP, die mit Version 7.2 beginnt, bietet eine vollständigere Ziparchive -Klasse, mit der Kennwörter festgelegt werden, um verschlüsselte Dateien zu lesen:

 $zip = new ZipArchive();
$res = $zip->open('encrypted.zip');
if ($res === true) {
    // Passwort festlegen
    $zip->setPassword('your_password');
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $stat = $zip->statIndex($i);
        echo "File: " . $stat['name'] . "\n";

        $stream = $zip->getStream($stat['name']);
        if (!$stream) {
            echo "Failed to open stream for {$stat['name']}\n";
            continue;
        }

        $contents = stream_get_contents($stream);
        fclose($stream);
        echo $contents;
    }
    $zip->close();
} else {
    echo "Failed to open zip file\n";
}

Schlüsselnotizen:

  • Mit der Methode setPassword () wird das für die Entschlüsselung erforderliche Kennwort bereitgestellt.

  • Verwenden Sie GetStream () , um den Inhaltsstream der verschlüsselten Datei zu erhalten, vorausgesetzt, das Kennwort ist korrekt.

  • Diese Methode kann den verschlüsselten ZIP -Dateiinhalt normal lesen.

4. Zusammenfassung

  • ZIP_READ () ist in den frühen Tagen eine Schneiderbetriebsschnittstelle in PHP und kann verschlüsselte Dateien nicht verarbeiten.

  • Verschlüsselte ZIP -Dateien müssen Schnittstellen verwenden, die die Kennwortentschlüsselung wie ziparchive unterstützen.

  • Mit ziparchive :: setPassword () kann PHP verschlüsselte Dateien erfolgreich öffnen und lesen.

  • In der tatsächlichen Entwicklung wird empfohlen, die Ziparchive -Klasse bei der Begegnung mit verschlüsselten Zip -Dateien zu verwenden, um die Verwendung von veraltetem Zip_Read () zu vermeiden.