Generowanie skompresowanych archiwów ZIP w PHP

ZIPW ostatnim czasie na jednej z tworzonych przeze mnie stron zaszła konieczność kompresji z poziomu skryptu PHP. Użytkownikowi musiałem dać możliwość wybrania niektórych plików i wysłania ich na swój adres e-mail (o tym także niedługo napiszę). Pokażę Wam, jak spakować dane do formatu ZIP za pomocą klasy PHP. Wbrew pozorom, jest to dziecinnie proste, a jedyne czego potrzebujemy to biblioteka zlib, która jest dostępna domyślnie na większości serwerów.

Aby zainicjować nowe archiwum wystarczy taki kod:

$zip = new ZipArchive(); // tworzymy nowy obiekt		
$zip->open('testowe_archiwum.zip', ZIPARCHIVE::CREATE); // nadajemy nazwę naszemu archiwum

Teraz bez problemu możemy dodawać nowe pliki:

$zip->addFile('ścieżka do pliku', 'nowa nazwa');
// na przykład:
$zip->addFile('dokumenty/raport-25-03-2013.pdf', 'raport.pdf');

Można oczywiście puścić pętelkę:

$folder = 'dokumenty/';
$files = scandir($folder);
foreach($files as $file) {
	$zip->addFile($folder.$file, $file);
}

A gdy wszystko już gotowe, zamykamy naszego ZIP-a:

$zip->close();

Jeśli chcemy, by stworzony plik wyświetlił się przeglądającemu do pobrania, to dodajemy nagłówki:

header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="testowe_archiwum.zip"');
readfile('testowe_archiwum.zip');

Pamiętajmy oczywiście, że wcześniej nie możemy wysłać przeglądarce ani jednego znaku, bo inaczej aplikacja zacznie krzyczeć. To wszystko – prawda, że łatwe?

komentarzy 7 do “Generowanie skompresowanych archiwów ZIP w PHP”

  • marcin pisze:

    Krzysztofie nie wiem czy skrypt był testowany czy nie, ale u mnie wogóle pobierało błędne archiwum.

    Więc zamiast:

    header('Content-type: application/zip');
    header('Content-Disposition: attachment; filename="testowe_archiwum.zip"');
    readfile('testowe_archiwum.zip');

    dałem tylko:

    header('Location: http://localhost/testowe_archiwum.zip');

    i pobiera pełne archiwum i do tego bezbłędnie. Szkoda, że nie sprawdziłem tego, że paczka tworzona jest na serwerze, nie zajęłoby mi to tyle czasu 🙂

    blog super 🙂

  • Przykładowy kod:

    open('testowe_archiwum.zip', ZIPARCHIVE::CREATE); // nadajemy nazwę naszemu archiwum
    $zip->addFile('11.txt', '11.txt');
    $folder = 'nnnn/';
    $files = scandir($folder);
    foreach($files as $file) {
        $zip->addFile($folder.$file, $file);
    }
    $zip->close();
    header('Content-type: application/zip');
    header('Content-Disposition: attachment; filename="testowe_archiwum.zip"');
    readfile('testowe_archiwum.zip');
    ?>
    

    Nie wiem czemu, ale pobiera się puste archiwum bez żadnych plików.

    • Filip Klar pisze:

      Dodałeś

      $zip = new ZipArchive();

      ?
      Ścieżka do pliku 11.txt i nazwa folderu nnnn są prawidłowe?

      • Fatal error: Call to undefined function open() in C:\xampp\htdocs\zip\zip.php on line 3

        Pojawia się ten błąd.
        na początku kodu znajduje się:
        $zip = new ZipArchive();
        … a ścieżki i nazwy plików są poprawne.

        • Filip Klar pisze:

          Musisz mieć

          $zip->open()

          a nie samo

          open()

          Komunikat sam mówi, że odwołujesz się do nieistniejącej funkcji.

          • open('testowe_archiwum.zip', ZIPARCHIVE::CREATE); // nadajemy nazwę naszemu archiwum
            $zip->addFile('11.txt', '11.txt');
            $folder = 'nnnn/';
            $files = scandir($folder);
            foreach($files as $file) {
                $zip->addFile($folder.$file, $file);
            }
            $zip->close();
            header('Content-type: application/zip');
            header('Content-Disposition: attachment; filename="testowe_archiwum.zip"');
            readfile('testowe_archiwum.zip');
            ?>

            Tak jak pisałem w pierwszym poście: nie wiem czemu, ale pobiera się puste archiwum bez żadnych plików.

Skomentuj

Kliknij tutaj, aby anulować odpowiadanie.

CommentLuv