- ZIP в PHP (ZipArchive)
- Добавление файлов в архив
- Заархивировать директорию с содержимым
- Переименовать файл
- Если файл лежит в папке
- Удалить файл из архива
- Если файл лежит в папке
- Список файлов в архиве
- Извлечь весь архив
- Извлечь определенные файлы
- Извлечь файл в поток
- ZipArchive::getNameIndex
- Возвращаемые значения
- Примеры
- User Contributed Notes 1 note
- zip_entry_name
- Description
- Parameters
- Return Values
- Changelog
- See Also
- User Contributed Notes 2 notes
ZIP в PHP (ZipArchive)
Класс 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();
ZipArchive::getNameIndex
Если флаг установлен в ZipArchive::FL_UNCHANGED , возвращается оригинальное неизмененное имя.
Возвращаемые значения
Возвращает имя при успехе или false в случае возникновения ошибки.
Примеры
Пример #1 Пример использования ZipArchive::getnameindex()
if ( $zip -> open ( ‘test.zip’ ) == TRUE ) for ( $i = 0 ; $i < $zip ->numFiles ; $i ++) $filename = $zip -> getNameIndex ( $i );
// .
>
>
?>?php
User Contributed Notes 1 note
I couldn’t find any how-to example for getting the filenames, so I made an easy one.
Here’s an example how to list all filenames from a zip-archive:
$zip = new ZipArchive ;
if ( $zip -> open ( ‘items.zip’ ))
<
for( $i = 0 ; $i < $zip ->numFiles ; $i ++)
<
echo ‘Filename: ‘ . $zip -> getNameIndex ( $i ) . ‘
‘ ;
>
>
else
<
echo ‘Error reading zip-archive!’ ;
>
?>
Hope it helps.
- ZipArchive
- addEmptyDir
- addFile
- addFromString
- addGlob
- addPattern
- clearError
- close
- count
- deleteIndex
- deleteName
- extractTo
- getArchiveComment
- getArchiveFlag
- getCommentIndex
- getCommentName
- getExternalAttributesIndex
- getExternalAttributesName
- getFromIndex
- getFromName
- getNameIndex
- getStatusString
- getStream
- getStreamIndex
- getStreamName
- isCompressionMethodSupported
- isEncryptionMethodSupported
- locateName
- open
- registerCancelCallback
- registerProgressCallback
- renameIndex
- renameName
- replaceFile
- setArchiveComment
- setArchiveFlag
- setCommentIndex
- setCommentName
- setCompressionIndex
- setCompressionName
- setEncryptionIndex
- setEncryptionName
- setExternalAttributesIndex
- setExternalAttributesName
- setMtimeIndex
- setMtimeName
- setPassword
- statIndex
- statName
- unchangeAll
- unchangeArchive
- unchangeIndex
- unchangeName
zip_entry_name
This function has been DEPRECATED as of PHP 8.0.0. Relying on this function is highly discouraged.
Description
Returns the name of the specified directory entry.
Parameters
A directory entry returned by zip_read() .
Return Values
The name of the directory entry, or false on failure.
Changelog
Version Description 8.0.0 This function is deprecated in favor of the Object API, see ZipArchive::statIndex() . See Also
User Contributed Notes 2 notes
If you want to get the real name of the file without the directory name, you can just use the function basename() as the follow:
$zip_dir = «./import/»;
$zip = zip_open($zip_dir.»import.zip»);
if ($zip) while ($zip_entry = zip_read($zip))$file = basename(zip_entry_name($zip_entry));
$fp = fopen($zip_dir.basename($file), «w+»);if (zip_entry_open($zip, $zip_entry, «r»)) $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
zip_entry_close($zip_entry);
>echo «The file «.$file.» was extracted to dir «.$zip_dir.»\n
«;
>
zip_close($zip);
>
?>Thefore you can extract files without concern with the directory that is set inside the zip source.
Remember to give write permission (w) on that directory.