Facebook
Twitter
Google+
Kommentare
0

Archivierung mit 7-Zip in PHP

Um Zip-Dateien zu packen und zu entpacken wird häufig die ZipArchive-Klasse in PHP genutzt, das ist einfach und unkompliziert, Beispiele dafür befindet sich im PHP Manual. Ein weiteres verbreitetes Komprimierungsformat ist RAR, doch PHP kann damit nativ nicht umgehen. Nehmen wir an wir bekommen RAR-Dateien hochgeladen und wollen sie entpacken. Wie machen wir das?

Wir benötigen also ein externes Programm, das mit RAR-Archiven umgehen kann, und ein weit verbreitetes Open-Source-Programm ist 7-Zip. 7-Zip beherrscht noch einige weitere Formate, unter anderem auch sein eigenes 7z-Format. Es ist teilweise besser als das kommerzielle WinZip. Hier die Haupt-Features von der Webseite:

  • High compression ratio in 7z format with LZMA and LZMA2 compression
  • Supported formats:
    • Packing / unpacking: 7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM
    • Unpacking only: ARJ, CAB, CHM, CPIO, CramFS, DEB, DMG, FAT, HFS, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, RAR, RPM, SquashFS, UDF, VHD, WIM, XAR and Z.
  • For ZIP and GZIP formats, 7-Zip provides a compression ratio that is 2-10 % better than the ratio provided by PKZip and WinZip
  • Strong AES-256 encryption in 7z and ZIP formats
  • Self-extracting capability for 7z format
  • Integration with Windows Shell
  • Powerful File Manager
  • Powerful command line version
  • Plugin for FAR Manager
  • Localizations for 79 languages

Es gibt also auch ein Kommandozeilentool, das wir aus PHP heraus nutzen können! Dann mal auf:

Zuerst laden wir uns 7-Zip herunter, entweder für Linux oder für Windows (7-Zip Command Line Version). Was wir benötigen ist die 7za Executable bzw. die 7za.exe

Dann muss die SevenZipArchive-Klasse heruntergeladen werden die ich auf GitHub erstellt habe. Diese kann dann direkt genutzt werden, hier beispielsweise zum Verifizieren, Packen und Entpacken einer TAR Datei unter Windows:

<?php

require_once 'SevenZipArchive.php';
$sevenZipArchive = new SevenZipArchive();
$sevenZipArchive->setExecutablePath('C:/Program Files (x86)/7-Zip/7za.exe')
        ->setArchivePath('C:/Temp/test.tar');

if ($sevenZipArchive->verify()) {
    echo 'verification successful';
} else {
    echo 'verification failed';
}
<?php

require_once 'SevenZipArchive.php';
$sevenZipArchive = new SevenZipArchive();
$sevenZipArchive->setExecutablePath('C:/Program Files (x86)/7-Zip/7za.exe')
        ->setArchivePath('C:/Temp/test.tar')
        ->setFilePath('C:/Temp/Angeln.gif');

if ($sevenZipArchive->compress()) {
    echo 'compression successful';
} else {
    echo 'compression failed';
}
<?php

require_once 'SevenZipArchive.php';
$sevenZipArchive = new SevenZipArchive();
$sevenZipArchive->setExecutablePath('C:/Program Files (x86)/7-Zip/7za.exe')
        ->setArchivePath('C:/Temp/test.tar')
        ->setFilePath('C:/Temp/C');

if ($sevenZipArchive->decompress()) {
    echo 'decompression successful';
} else {
    echo 'decompression failed';
}

Die SevenZipArchive Klasse hat aktuell nur sehr grundsätzliche Fähigkeiten, man kann sie noch erweitern, zum Beispiel um die Fähigkeit, mehrere Dateien in ein Archiv zu packen. 7-Zip kann noch viel mehr, das könnte man alles noch einbauen. Wer möchte kann gern forken und mir Pull-Requests schicken, würd mich freuen!

Es gäbe auch die Möglichkeit eine 7-Zip PHP Extension zu erstellen, aktuell scheint es keine zu geben, aber der Bedarf ist da. Vielleicht findet sich ja jemand der sich da mal ranmachen möchte, einen Wrapper für 7za zu schreiben.

Keine ähnlichen Artikel.

Über den Autor

PHP Gangsta

Der zweitgrößte deutsche, eher praxisorientierte PHP-Blog von Michael Kliewe veröffentlicht seit Mitte 2009 Artikel für Fortgeschrittene.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen