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