Класс ZipArchive позволяет быстро и удобно работать с ZIP-архивам, рассмотрим основные возможности класса.
В примере используются константы:
ZipArchive::CREATE– создавать архив, если он не существуетZipArchive::OVERWRITE– если архив существует, то игнорировать текущее его содержимое т.е. работать как с пустым архивом.
$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip', ZipArchive::CREATE|ZipArchive::OVERWRITE);
$zip->addFile(__DIR__ . '/image1.jpg', 'image1.jpg');
$zip->addFile(__DIR__ . '/image2.jpg', 'image2.jpg');
$zip->close();
Если файл необходимо поместить в директорию, то предварительно не нужно создавать пустую папку. Можно просто указать путь и имя файла, например «src»:
$zip->addFile(__DIR__ . '/image1.jpg', 'src/image1.jpg');
$zip->addFile(__DIR__ . '/image2.jpg', 'src/image2.jpg');
Если текстовой файл генерится прямо в скрипте, то удобней скинуть его в архив методом addFromString().
$contents = 'Содержание файла file.log';
$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip', ZipArchive::CREATE|ZipArchive::OVERWRITE);
$zip->addFromString('file.log', $contents);
$zip->close();
Сделать архив сайта можно с помощью рекурсивной функции, функция обойдет все файлы в директориях и добавит их в архив.
function addFileRecursion($zip, $dir, $start = '')
{
if (empty($start)) {
$start = $dir;
}
if ($objs = glob($dir . '/*')) {
foreach($objs as $obj) {
if (is_dir($obj)) {
addFileRecursion($zip, $obj, $start);
} else {
$zip->addFile($obj, str_replace(dirname($start) . '/', '', $obj));
}
}
}
}
$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip', ZipArchive::CREATE|ZipArchive::OVERWRITE);
addFileRecursion($zip, __DIR__ . '/test');
$zip->close();
$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');
$zip->renameName('image2.jpg', 'images.jpg');
$zip->close();
Если файл лежит в папке
$zip->renameName('src/image2.jpg', 'src/images.jpg');
$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');
$zip->deleteName('image2.jpg');
$zip->close();
Если файл лежит в папке
$zip->deleteName('src/image2.jpg');
$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');
$i = 0;
$list = array();
while($name = $zip->getNameIndex($i)) {
$list[$i] = $name;
$i++;
}
print_r($list);
$zip->close();
Array
(
[0] => src/image1.jpg
[1] => src/image2.jpg
[2] => file.log
)
$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');
$zip->extractTo(__DIR__);
$zip->close();
$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');
$zip->extractTo(__DIR__, array('src/image1.jpg', 'src/image2.jpg'));
$zip->close();
Данный метод удобен если требуется только прочитать содержимое файла.
$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');
$contents = '';
$fp = $zip->getStream('file.log');
while (!feof($fp)) {
$contents .= fread($fp, 2);
}
fclose($fp);
echo $contents;
$zip->close();






$zip->addFromString($newFileName, file_get_contents($filePath));