PHP архивация файлов в формате ZIP
Здравствуйте, уважаемые посетители моего блога Курилка.co.ua. Ничто не стоит на месте и такой язык программирования как PHP активно развивается. Если вам необходимо работать с ZIP архивами файлов, вы можете воспользоваться классом ZipArchive. Тем не менее, старые и проверенные временем решения не утратили своей привлекательности.
Но все по порядку. В начале, давайте попытаемся ответить на вопрос: «Что такое zip-архив?»
Zip — популярный формат сжатия данных и архивации файлов. Файл ZIP, чаще всего имеющий расширение .zip, хранит в сжатом или несжатом виде один или несколько файлов, которые можно из него извлечь путём распаковки с помощью специальной программы.
Этот формат был разработан Филом Кацем для использования в программе PKZIP. Впоследствии появилось множество других утилит, создающих файл в таком же формате. Если вас заинтересовал этот вопрос, советую ознакомить с соответствующей статьёй в Википедии.
Ну а теперь к делу. Иногда бывает необходимо хранить файлы в архивах. С одной стороны они меньше по объёму, с другой несколько файлов можно поместить в один. Конечно, для архивации файлов можно воспользоваться специальным программным обеспечением, к примеру WinZip или 7-zip, но в некоторых случаях имеет смысл автоматизировать процесс. В данной заметке мы поговорим о такой штуке как Zip file creation class — класс найденный мной в сборке phpMyAdmin.
Не вдаваясь в подробности, рассмотрим основные его функции:
addFile($data, $name, $time=0)
Описание: добавление файла в архив.
Параметры:
- $data – содержание файла
- $name – имя файла в архиве, может содержать путь
- $time – временная метка (timestamp), по умолчание текущая (не обязательный параметр)
file()
Описание: архивирует и возвращает заархивированные данные в виде строки.
Для наглядности работы с классом приведу небольшой пример:
<?php
include zip.lib.php
$data = "текст файла";
$name = "filename.txt";
$zipfile = new zipfile();
$zipfile->addFile($data, $name);
$zipdata = $zipfile->file();
$fp = fopen ("filename.zip", "w+");
fwrite($fp, $zipdata);
fclose($fp);
?>
Как вы видите, здесь мы создали объект $zipfile, заархивировали данные $data функцией addFile как файл filename.txt и получили архивированные данные функцией file(), которые сохранили как файл filename.zip.
К слову, если вы хотите сохранить файл с кириллическими именами, не забудьте сконвертировать их в досовскую кодировку cp866, к примеру так (за подсказку спасибо Александру):
$filename = iconv('windows-1251', 'cp866', $filename);