Generowanie skompresowanych archiwów ZIP w PHP
W 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?
Krzysztofie nie wiem czy skrypt był testowany czy nie, ale u mnie wogóle pobierało błędne archiwum.
Więc zamiast:
dałem tylko:
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 🙂
Tak też działa. Ale mój kod przetestowałem przed chwilą i bez problemu otworzyło mi się archiwum. Może to kwestia serwera?
Przykładowy kod:
Nie wiem czemu, ale pobiera się puste archiwum bez żadnych plików.
Dodałeś
?
Ś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.
Musisz mieć
a nie samo
Komunikat sam mówi, że odwołujesz się do nieistniejącej funkcji.
Tak jak pisałem w pierwszym poście: nie wiem czemu, ale pobiera się puste archiwum bez żadnych plików.