酒店预订平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.RU.md 52 KiB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816
  1. `PhpZip`
  2. ========
  3. `PhpZip` - php библиотека для продвинутой работы с ZIP-архивами.
  4. [![Build Status](https://travis-ci.org/Ne-Lexa/php-zip.svg?branch=master)](https://travis-ci.org/Ne-Lexa/php-zip)
  5. [![Code Coverage](https://scrutinizer-ci.com/g/Ne-Lexa/php-zip/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/Ne-Lexa/php-zip/?branch=master)
  6. [![Latest Stable Version](https://poser.pugx.org/nelexa/zip/v/stable)](https://packagist.org/packages/nelexa/zip)
  7. [![Total Downloads](https://poser.pugx.org/nelexa/zip/downloads)](https://packagist.org/packages/nelexa/zip)
  8. [![Minimum PHP Version](http://img.shields.io/badge/php-%3E%3D%205.5-8892BF.svg)](https://php.net/)
  9. [![License](https://poser.pugx.org/nelexa/zip/license)](https://packagist.org/packages/nelexa/zip)
  10. [English Documentation](README.md)
  11. Содержание
  12. ----------
  13. - [Функционал](#Features)
  14. - [Требования](#Requirements)
  15. - [Установка](#Installation)
  16. - [Примеры](#Examples)
  17. - [Глоссарий](#Glossary)
  18. - [Документация](#Documentation)
  19. + [Обзор методов класса `\PhpZip\ZipFile`](#Documentation-Overview)
  20. + [Создание/Открытие ZIP-архива](#Documentation-Open-Zip-Archive)
  21. + [Чтение записей из архива](#Documentation-Open-Zip-Entries)
  22. + [Перебор записей/Итератор](#Documentation-Zip-Iterate)
  23. + [Получение информации о записях](#Documentation-Zip-Info)
  24. + [Добавление записей в архив](#Documentation-Add-Zip-Entries)
  25. + [Удаление записей из архива](#Documentation-Remove-Zip-Entries)
  26. + [Работа с записями и с архивом](#Documentation-Entries)
  27. + [Работа с паролями](#Documentation-Password)
  28. + [zipalign - выравнивание архива для оптимизации Android пакетов (APK)](#Documentation-ZipAlign-Usage)
  29. + [Отмена изменений](#Documentation-Unchanged)
  30. + [Сохранение файла или вывод в браузер](#Documentation-Save-Or-Output-Entries)
  31. + [Закрытие архива](#Documentation-Close-Zip-Archive)
  32. - [Запуск тестов](#Running-Tests)
  33. - [История изменений](#Changelog)
  34. - [Обновление версий](#Upgrade)
  35. + [Обновление с версии 2 до версии 3.0](#Upgrade-v2-to-v3)
  36. ### <a name="Features"></a> Функционал
  37. - Открытие и разархивирование ZIP-архивов.
  38. - Создание ZIP-архивов.
  39. - Модификация ZIP-архивов.
  40. - Чистый php (не требуется расширение `php-zip` и класс `\ZipArchive`).
  41. - Поддерживается сохранение архива в файл, вывод архива в браузер или вывод в виде строки, без сохранения в файл.
  42. - Поддерживаются комментарии архива и комментарии отдельных записей.
  43. - Получение подробной информации о каждой записи в архиве.
  44. - Поддерживаются только следующие методы сжатия:
  45. + Без сжатия (Stored).
  46. + Deflate сжатие.
  47. + BZIP2 сжатие при наличии расширения `php-bz2`.
  48. - Поддержка `ZIP64` (размер файла более 4 GB или количество записей в архиве более 65535).
  49. - Встроенная поддержка выравнивания архива для оптимизации Android пакетов (APK) [`zipalign`](https://developer.android.com/studio/command-line/zipalign.html).
  50. - Работа с паролями для PHP 5.5
  51. > **Внимание!**
  52. >
  53. > Для 32-bit систем, в данный момент не поддерживается метод шифрование `Traditional PKWARE Encryption (ZipCrypto)`.
  54. > Используйте метод шифрования `WinZIP AES Encryption`, когда это возможно.
  55. + Установка пароля для чтения архива глобально или для некоторых записей.
  56. + Изменение пароля архива, в том числе и для отдельных записей.
  57. + Удаление пароля архива глобально или для отдельных записей.
  58. + Установка пароля и/или метода шифрования, как для всех, так и для отдельных записей в архиве.
  59. + Установка разных паролей и методов шифрования для разных записей.
  60. + Удаление пароля для всех или для некоторых записей.
  61. + Поддержка методов шифрования `Traditional PKWARE Encryption (ZipCrypto)` и `WinZIP AES Encryption (128, 192 или 256 bit)`.
  62. + Установка метода шифрования для всех или для отдельных записей в архиве.
  63. ### <a name="Requirements"></a> Требования
  64. - `PHP` >= 5.5 (предпочтительно 64-bit).
  65. - Опционально php-расширение `bzip2` для поддержки BZIP2 компрессии.
  66. - Опционально php-расширение `openssl` или `mcrypt` для `WinZip Aes Encryption` шифрования.
  67. ### <a name="Installation"></a> Установка
  68. `composer require nelexa/zip`
  69. Последняя стабильная версия: [![Latest Stable Version](https://poser.pugx.org/nelexa/zip/v/stable)](https://packagist.org/packages/nelexa/zip)
  70. ### <a name="Examples"></a> Примеры
  71. ```php
  72. // создание нового архива
  73. $zipFile = new \PhpZip\ZipFile();
  74. try{
  75. $zipFile
  76. ->addFromString('zip/entry/filename', "Is file content") // добавить запись из строки
  77. ->addFile('/path/to/file', 'data/tofile') // добавить запись из файла
  78. ->addDir(__DIR__, 'to/path/') // добавить файлы из директории
  79. ->saveAsFile($outputFilename) // сохранить архив в файл
  80. ->close(); // закрыть архив
  81. // открытие архива, извлечение файлов, удаление файлов, добавление файлов, установка пароля и вывод архива в браузер.
  82. $zipFile
  83. ->openFile($outputFilename) // открыть архив из файла
  84. ->extractTo($outputDirExtract) // извлечь файлы в заданную директорию
  85. ->deleteFromRegex('~^\.~') // удалить все скрытые (Unix) файлы
  86. ->addFromString('dir/file.txt', 'Test file') // добавить новую запись из строки
  87. ->setPassword('password') // установить пароль на все записи
  88. ->outputAsAttachment('library.jar'); // вывести в браузер без сохранения в файл
  89. }
  90. catch(\PhpZip\Exception\ZipException $e){
  91. // обработка исключения
  92. }
  93. finally{
  94. $zipFile->close();
  95. }
  96. ```
  97. Другие примеры можно посмотреть в папке `tests/`.
  98. ### <a name="Glossary"></a> Глоссарий
  99. **Запись в ZIP-архиве (Zip Entry)** - файл или папка в ZIP-архиве. У каждой записи в архиве есть определённые свойства, например: имя файла, метод сжатия, метод шифрования, размер файла до сжатия, размер файла после сжатия, CRC32 и другие.
  100. ### <a name="Documentation"></a> Документация
  101. #### <a name="Documentation-Overview"></a> Обзор методов класса `\PhpZip\ZipFile`
  102. - [ZipFile::__construct](#Documentation-ZipFile-__construct) - инициализацирует ZIP-архив.
  103. - [ZipFile::addAll](#Documentation-ZipFile-addAll) - добавляет все записи из массива.
  104. - [ZipFile::addDir](#Documentation-ZipFile-addDir) - добавляет файлы из директории по указанному пути без вложенных директорий.
  105. - [ZipFile::addDirRecursive](#Documentation-ZipFile-addDirRecursive) - добавляет файлы из директории по указанному пути c вложенными директориями.
  106. - [ZipFile::addEmptyDir](#Documentation-ZipFile-addEmptyDir) - добавляет в ZIP-архив новую директорию.
  107. - [ZipFile::addFile](#Documentation-ZipFile-addFile) - добавляет в ZIP-архив файл по указанному пути.
  108. - [ZipFile::addSplFile](#Documentation-ZipFile-addSplFile) - добавляет объект `\SplFileInfo` в zip-архив.
  109. - [ZipFile::addFromFinder](#Documentation-ZipFile-addFromFinder) - добавляет файлы из `Symfony\Component\Finder\Finder` в zip архив.
  110. - [ZipFile::addFilesFromIterator](#Documentation-ZipFile-addFilesFromIterator) - добавляет файлы из итератора директорий.
  111. - [ZipFile::addFilesFromGlob](#Documentation-ZipFile-addFilesFromGlob) - добавляет файлы из директории в соответствии с glob шаблоном без вложенных директорий.
  112. - [ZipFile::addFilesFromGlobRecursive](#Documentation-ZipFile-addFilesFromGlobRecursive) - добавляет файлы из директории в соответствии с glob шаблоном c вложенными директориями.
  113. - [ZipFile::addFilesFromRegex](#Documentation-ZipFile-addFilesFromRegex) - добавляет файлы из директории в соответствии с регулярным выражением без вложенных директорий.
  114. - [ZipFile::addFilesFromRegexRecursive](#Documentation-ZipFile-addFilesFromRegexRecursive) - добавляет файлы из директории в соответствии с регулярным выражением c вложенными директориями.
  115. - [ZipFile::addFromStream](#Documentation-ZipFile-addFromStream) - добавляет в ZIP-архив запись из потока.
  116. - [ZipFile::addFromString](#Documentation-ZipFile-addFromString) - добавляет файл в ZIP-архив, используя его содержимое в виде строки.
  117. - [ZipFile::close](#Documentation-ZipFile-close) - закрывает ZIP-архив.
  118. - [ZipFile::count](#Documentation-ZipFile-count) - возвращает количество записей в архиве.
  119. - [ZipFile::deleteFromName](#Documentation-ZipFile-deleteFromName) - удаляет запись по имени.
  120. - [ZipFile::deleteFromGlob](#Documentation-ZipFile-deleteFromGlob) - удаляет записи в соответствии с glob шаблоном.
  121. - [ZipFile::deleteFromRegex](#Documentation-ZipFile-deleteFromRegex) - удаляет записи в соответствии с регулярным выражением.
  122. - [ZipFile::deleteAll](#Documentation-ZipFile-deleteAll) - удаляет все записи в ZIP-архиве.
  123. - [ZipFile::disableEncryption](#Documentation-ZipFile-disableEncryption) - отключает шифрования всех записей, находящихся в архиве.
  124. - [ZipFile::disableEncryptionEntry](#Documentation-ZipFile-disableEncryptionEntry) - отключает шифрование записи по её имени.
  125. - [ZipFile::extractTo](#Documentation-ZipFile-extractTo) - извлекает содержимое архива в заданную директорию.
  126. - [ZipFile::getAllInfo](#Documentation-ZipFile-getAllInfo) - возвращает подробную информацию обо всех записях в архиве.
  127. - [ZipFile::getArchiveComment](#Documentation-ZipFile-getArchiveComment) - возвращает комментарий ZIP-архива.
  128. - [ZipFile::getEntryComment](#Documentation-ZipFile-getEntryComment) - возвращает комментарий к записи, используя её имя.
  129. - [ZipFile::getEntryContent](#Documentation-ZipFile-getEntryContent) - возвращает содержимое записи.
  130. - [ZipFile::getEntryInfo](#Documentation-ZipFile-getEntryInfo) - возвращает подробную информацию о записи в архиве.
  131. - [ZipFile::getListFiles](#Documentation-ZipFile-getListFiles) - возвращает список файлов архива.
  132. - [ZipFile::hasEntry](#Documentation-ZipFile-hasEntry) - проверяет, присутствует ли запись в архиве.
  133. - [ZipFile::isDirectory](#Documentation-ZipFile-isDirectory) - проверяет, является ли запись в архиве директорией.
  134. - [ZipFile::matcher](#Documentation-ZipFile-matcher) - выборка записей в архиве для проведения операций над выбранными записями.
  135. - [ZipFile::openFile](#Documentation-ZipFile-openFile) - открывает ZIP-архив из файла.
  136. - [ZipFile::openFromString](#Documentation-ZipFile-openFromString) - открывает ZIP-архив из строки.
  137. - [ZipFile::openFromStream](#Documentation-ZipFile-openFromStream) - открывает ZIP-архив из потока.
  138. - [ZipFile::outputAsAttachment](#Documentation-ZipFile-outputAsAttachment) - выводит ZIP-архив в браузер.
  139. - [ZipFile::outputAsResponse](#Documentation-ZipFile-outputAsResponse) - выводит ZIP-архив, как Response PSR-7.
  140. - [ZipFile::outputAsString](#Documentation-ZipFile-outputAsString) - выводит ZIP-архив в виде строки.
  141. - [ZipFile::rename](#Documentation-ZipFile-rename) - переименовывает запись по имени.
  142. - [ZipFile::rewrite](#Documentation-ZipFile-rewrite) - сохраняет изменения и заново открывает изменившийся архив.
  143. - [ZipFile::saveAsFile](#Documentation-ZipFile-saveAsFile) - сохраняет архив в файл.
  144. - [ZipFile::saveAsStream](#Documentation-ZipFile-saveAsStream) - записывает архив в поток.
  145. - [ZipFile::setArchiveComment](#Documentation-ZipFile-setArchiveComment) - устанавливает комментарий к ZIP-архиву.
  146. - [ZipFile::setCompressionLevel](#Documentation-ZipFile-setCompressionLevel) - устанавливает уровень сжатия для всех файлов, находящихся в архиве.
  147. - [ZipFile::setCompressionLevelEntry](#Documentation-ZipFile-setCompressionLevelEntry) - устанавливает уровень сжатия для определённой записи в архиве.
  148. - [ZipFile::setCompressionMethodEntry](#Documentation-ZipFile-setCompressionMethodEntry) - устанавливает метод сжатия для определённой записи в архиве.
  149. - [ZipFile::setEntryComment](#Documentation-ZipFile-setEntryComment) - устанавливает комментарий к записи, используя её имя.
  150. - [ZipFile::setReadPassword](#Documentation-ZipFile-setReadPassword) - устанавливает пароль на чтение открытого запароленного архива для всех зашифрованных записей.
  151. - [ZipFile::setReadPasswordEntry](#Documentation-ZipFile-setReadPasswordEntry) - устанавливает пароль на чтение конкретной зашифрованной записи открытого запароленного архива.
  152. - ~~ZipFile::withNewPassword~~ - устаревший метод (**deprecated**) используйте метод [ZipFile::setPassword](#Documentation-ZipFile-setPassword).
  153. - [ZipFile::setPassword](#Documentation-ZipFile-setPassword) - устанавливает новый пароль для всех файлов, находящихся в архиве.
  154. - [ZipFile::setPasswordEntry](#Documentation-ZipFile-setPasswordEntry) - устанавливает новый пароль для конкретного файла.
  155. - [ZipFile::setZipAlign](#Documentation-ZipFile-setZipAlign) - устанавливает выравнивание архива для оптимизации APK файлов (Android packages).
  156. - [ZipFile::unchangeAll](#Documentation-ZipFile-unchangeAll) - отменяет все изменения, сделанные в архиве.
  157. - [ZipFile::unchangeArchiveComment](#Documentation-ZipFile-unchangeArchiveComment) - отменяет изменения в комментарии к архиву.
  158. - [ZipFile::unchangeEntry](#Documentation-ZipFile-unchangeEntry) - отменяет изменения для конкретной записи архива.
  159. - ~~ZipFile::withoutPassword~~ - устаревший метод (**deprecated**) используйте метод [ZipFile::disableEncryption](#Documentation-ZipFile-disableEncryption).
  160. - ~~ZipFile::withReadPassword~~ - устаревший метод (**deprecated**) используйте метод [ZipFile::setReadPassword](#Documentation-ZipFile-setReadPassword).
  161. #### <a name="Documentation-Open-Zip-Archive"></a> Создание/Открытие ZIP-архива
  162. <a name="Documentation-ZipFile-__construct"></a>**ZipFile::__construct** - Инициализацирует ZIP-архив.
  163. ```php
  164. $zipFile = new \PhpZip\ZipFile();
  165. ```
  166. <a name="Documentation-ZipFile-openFile"></a> **ZipFile::openFile** - открывает ZIP-архив из файла.
  167. ```php
  168. $zipFile = new \PhpZip\ZipFile();
  169. $zipFile->openFile('file.zip');
  170. ```
  171. <a name="Documentation-ZipFile-openFromString"></a> **ZipFile::openFromString** - открывает ZIP-архив из строки.
  172. ```php
  173. $zipFile = new \PhpZip\ZipFile();
  174. $zipFile->openFromString($stringContents);
  175. ```
  176. <a name="Documentation-ZipFile-openFromStream"></a> **ZipFile::openFromStream** - открывает ZIP-архив из потока.
  177. ```php
  178. $stream = fopen('file.zip', 'rb');
  179. $zipFile = new \PhpZip\ZipFile();
  180. $zipFile->openFromStream($stream);
  181. ```
  182. #### <a name="Documentation-Open-Zip-Entries"></a> Чтение записей из архива
  183. <a name="Documentation-ZipFile-count"></a> **ZipFile::count** - возвращает количество записей в архиве.
  184. ```php
  185. $zipFile = new \PhpZip\ZipFile();
  186. $count = count($zipFile);
  187. // или
  188. $count = $zipFile->count();
  189. ```
  190. <a name="Documentation-ZipFile-getListFiles"></a> **ZipFile::getListFiles** - возвращает список файлов архива.
  191. ```php
  192. $zipFile = new \PhpZip\ZipFile();
  193. $listFiles = $zipFile->getListFiles();
  194. // Пример содержимого массива:
  195. // array (
  196. // 0 => 'info.txt',
  197. // 1 => 'path/to/file.jpg',
  198. // 2 => 'another path/',
  199. // )
  200. ```
  201. <a name="Documentation-ZipFile-getEntryContent"></a> **ZipFile::getEntryContent** - возвращает содержимое записи.
  202. ```php
  203. // $entryName = 'path/to/example-entry-name.txt';
  204. $zipFile = new \PhpZip\ZipFile();
  205. $contents = $zipFile[$entryName];
  206. // или
  207. $contents = $zipFile->getEntryContents($entryName);
  208. ```
  209. <a name="Documentation-ZipFile-hasEntry"></a> **ZipFile::hasEntry** - проверяет, присутствует ли запись в архиве.
  210. ```php
  211. // $entryName = 'path/to/example-entry-name.txt';
  212. $zipFile = new \PhpZip\ZipFile();
  213. $hasEntry = isset($zipFile[$entryName]);
  214. // или
  215. $hasEntry = $zipFile->hasEntry($entryName);
  216. ```
  217. <a name="Documentation-ZipFile-isDirectory"></a> **ZipFile::isDirectory** - проверяет, является ли запись в архиве директорией.
  218. ```php
  219. // $entryName = 'path/to/';
  220. $zipFile = new \PhpZip\ZipFile();
  221. $isDirectory = $zipFile->isDirectory($entryName);
  222. ```
  223. <a name="Documentation-ZipFile-extractTo"></a> **ZipFile::extractTo** - извлекает содержимое архива в заданную директорию.
  224. Директория должна существовать.
  225. ```php
  226. $zipFile = new \PhpZip\ZipFile();
  227. $zipFile->extractTo($directory);
  228. ```
  229. Можно извлечь только некоторые записи в заданную директорию.
  230. Директория должна существовать.
  231. ```php
  232. $extractOnlyFiles = [
  233. 'filename1',
  234. 'filename2',
  235. 'dir/dir/dir/'
  236. ];
  237. $zipFile = new \PhpZip\ZipFile();
  238. $zipFile->extractTo($toDirectory, $extractOnlyFiles);
  239. ```
  240. #### <a name="Documentation-Zip-Iterate"></a> Перебор записей/Итератор
  241. `ZipFile` является итератором.
  242. Можно перебрать все записи, через цикл `foreach`.
  243. ```php
  244. foreach($zipFile as $entryName => $contents){
  245. echo "Файл: $entryName" . PHP_EOL;
  246. echo "Содержимое: $contents" . PHP_EOL;
  247. echo '-----------------------------' . PHP_EOL;
  248. }
  249. ```
  250. Можно использовать паттерн `Iterator`.
  251. ```php
  252. $iterator = new \ArrayIterator($zipFile);
  253. while ($iterator->valid())
  254. {
  255. $entryName = $iterator->key();
  256. $contents = $iterator->current();
  257. echo "Файл: $entryName" . PHP_EOL;
  258. echo "Содержимое: $contents" . PHP_EOL;
  259. echo '-----------------------------' . PHP_EOL;
  260. $iterator->next();
  261. }
  262. ```
  263. #### <a name="Documentation-Zip-Info"></a> Получение информации о записях
  264. <a name="Documentation-ZipFile-getArchiveComment"></a> **ZipFile::getArchiveComment** - возвращает комментарий ZIP-архива.
  265. ```php
  266. $commentArchive = $zipFile->getArchiveComment();
  267. ```
  268. <a name="Documentation-ZipFile-getEntryComment"></a> **ZipFile::getEntryComment** - возвращает комментарий к записи, используя её имя.
  269. ```php
  270. $commentEntry = $zipFile->getEntryComment($entryName);
  271. ```
  272. <a name="Documentation-ZipFile-getEntryInfo"></a> **ZipFile::getEntryInfo** - возвращает подробную информацию о записи в архиве.
  273. ```php
  274. $zipFile = new \PhpZip\ZipFile();
  275. $zipInfo = $zipFile->getEntryInfo('file.txt');
  276. ```
  277. <a name="Documentation-ZipFile-getAllInfo"></a> **ZipFile::getAllInfo** - возвращает подробную информацию обо всех записях в архиве.
  278. ```php
  279. $zipAllInfo = $zipFile->getAllInfo();
  280. ```
  281. #### <a name="Documentation-Add-Zip-Entries"></a> Добавление записей в архив
  282. Все методы добавления записей в ZIP-архив позволяют указать метод сжатия содержимого.
  283. Доступны следующие методы сжатия:
  284. - `\PhpZip\Constants\ZipCompressionMethod::STORED` - без сжатия
  285. - `\PhpZip\Constants\ZipCompressionMethod::DEFLATED` - Deflate сжатие
  286. - `\PhpZip\Constants\ZipCompressionMethod::BZIP2` - Bzip2 сжатие при наличии расширения `ext-bz2`
  287. <a name="Documentation-ZipFile-addFile"></a> **ZipFile::addFile** - добавляет в ZIP-архив файл по указанному пути из файловой системы.
  288. ```php
  289. $zipFile = new \PhpZip\ZipFile();
  290. // $file = '...../file.ext';
  291. $zipFile->addFile($file);
  292. // можно указать имя записи в архиве (если null, то используется последний компонент из имени файла)
  293. $zipFile->addFile($file, $entryName);
  294. // можно указать метод сжатия
  295. $zipFile->addFile($file, $entryName, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия
  296. $zipFile->addFile($file, $entryName, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие
  297. $zipFile->addFile($file, $entryName, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие
  298. ```
  299. <a name="Documentation-ZipFile-addSplFile"></a>
  300. **ZipFile::addSplFile"** - добавляет объект `\SplFileInfo` в zip-архив.
  301. ```php
  302. // $file = '...../file.ext';
  303. // $entryName = 'file2.ext'
  304. $zipFile = new \PhpZip\ZipFile();
  305. $splFile = new \SplFileInfo('README.md');
  306. $zipFile->addSplFile($splFile);
  307. $zipFile->addSplFile($splFile, $entryName);
  308. // or
  309. $zipFile[$entryName] = new \SplFileInfo($file);
  310. // установить метод сжатия
  311. $zipFile->addSplFile($splFile, $entryName, $options = [
  312. \PhpZip\Constants\ZipOptions::COMPRESSION_METHOD => \PhpZip\Constants\ZipCompressionMethod::DEFLATED,
  313. ]);
  314. ```
  315. <a name="Documentation-ZipFile-addFromFinder"></a>
  316. **ZipFile::addFromFinder"** - добавляет файлы из `Symfony\Component\Finder\Finder` в zip архив.
  317. https://symfony.com/doc/current/components/finder.html
  318. ```php
  319. $finder = new \Symfony\Component\Finder\Finder();
  320. $finder
  321. ->files()
  322. ->name('*.{jpg,jpeg,gif,png}')
  323. ->name('/^[0-9a-f]\./')
  324. ->contains('/lorem\s+ipsum$/i')
  325. ->in('path');
  326. $zipFile = new \PhpZip\ZipFile();
  327. $zipFile->addFromFinder($finder, $options = [
  328. \PhpZip\Constants\ZipOptions::COMPRESSION_METHOD => \PhpZip\Constants\ZipCompressionMethod::DEFLATED,
  329. \PhpZip\Constants\ZipOptions::MODIFIED_TIME => new \DateTimeImmutable('-1 day 5 min')
  330. ]);
  331. ```
  332. <a name="Documentation-ZipFile-addFromString"></a> **ZipFile::addFromString** - добавляет файл в ZIP-архив, используя его содержимое в виде строки.
  333. ```php
  334. $zipFile = new \PhpZip\ZipFile();
  335. $zipFile[$entryName] = $contents;
  336. // или
  337. $zipFile->addFromString($entryName, $contents);
  338. // можно указать метод сжатия
  339. $zipFile->addFromString($entryName, $contents, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия
  340. $zipFile->addFromString($entryName, $contents, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие
  341. $zipFile->addFromString($entryName, $contents, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие
  342. ```
  343. <a name="Documentation-ZipFile-addFromStream"></a> **ZipFile::addFromStream** - добавляет в ZIP-архив запись из потока.
  344. ```php
  345. // $stream = fopen(..., 'rb');
  346. $zipFile->addFromStream($stream, $entryName);
  347. // можно указать метод сжатия
  348. $zipFile->addFromStream($stream, $entryName, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия
  349. $zipFile->addFromStream($stream, $entryName, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие
  350. $zipFile->addFromStream($stream, $entryName, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие
  351. ```
  352. <a name="Documentation-ZipFile-addEmptyDir"></a> **ZipFile::addEmptyDir** - добавляет в ZIP-архив новую (пустую) директорию.
  353. ```php
  354. // $path = "path/to/";
  355. $zipFile->addEmptyDir($path);
  356. // или
  357. $zipFile[$path] = null;
  358. ```
  359. <a name="Documentation-ZipFile-addAll"></a> **ZipFile::addAll** - добавляет все записи из массива.
  360. ```php
  361. $entries = [
  362. 'file.txt' => 'file contents', // запись из строки данных
  363. 'empty dir/' => null, // пустой каталог
  364. 'path/to/file.jpg' => fopen('..../filename', 'r'), // запись из потока
  365. 'path/to/file.dat' => new \SplFileInfo('..../filename'), // запись из файла
  366. ];
  367. $zipFile->addAll($entries);
  368. ```
  369. <a name="Documentation-ZipFile-addDir"></a> **ZipFile::addDir** - добавляет файлы из директории по указанному пути без вложенных директорий.
  370. ```php
  371. $zipFile->addDir($dirName);
  372. // можно указать путь в архиве в который необходимо поместить записи
  373. $localPath = "to/path/";
  374. $zipFile->addDir($dirName, $localPath);
  375. // можно указать метод сжатия
  376. $zipFile->addDir($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия
  377. $zipFile->addDir($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие
  378. $zipFile->addDir($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие
  379. ```
  380. <a name="Documentation-ZipFile-addDirRecursive"></a> **ZipFile::addDirRecursive** - добавляет файлы из директории по указанному пути c вложенными директориями.
  381. ```php
  382. $zipFile->addDirRecursive($dirName);
  383. // можно указать путь в архиве в который необходимо поместить записи
  384. $localPath = "to/path/";
  385. $zipFile->addDirRecursive($dirName, $localPath);
  386. // можно указать метод сжатия
  387. $zipFile->addDirRecursive($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия
  388. $zipFile->addDirRecursive($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие
  389. $zipFile->addDirRecursive($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие
  390. ```
  391. <a name="Documentation-ZipFile-addFilesFromIterator"></a> **ZipFile::addFilesFromIterator** - добавляет файлы из итератора директорий.
  392. ```php
  393. // $directoryIterator = new \DirectoryIterator($dir); // без вложенных директорий
  394. // $directoryIterator = new \RecursiveDirectoryIterator($dir); // с вложенными директориями
  395. $zipFile->addFilesFromIterator($directoryIterator);
  396. // можно указать путь в архиве в который необходимо поместить записи
  397. $localPath = "to/path/";
  398. $zipFile->addFilesFromIterator($directoryIterator, $localPath);
  399. // или
  400. $zipFile[$localPath] = $directoryIterator;
  401. // можно указать метод сжатия
  402. $zipFile->addFilesFromIterator($directoryIterator, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия
  403. $zipFile->addFilesFromIterator($directoryIterator, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие
  404. $zipFile->addFilesFromIterator($directoryIterator, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие
  405. ```
  406. Пример добавления файлов из директории в архив с игнорированием некоторых файлов при помощи итератора директорий.
  407. ```php
  408. $ignoreFiles = [
  409. "file_ignore.txt",
  410. "dir_ignore/sub dir ignore/"
  411. ];
  412. // $directoryIterator = new \DirectoryIterator($dir); // без вложенных директорий
  413. // $directoryIterator = new \RecursiveDirectoryIterator($dir); // с вложенными директориями
  414. // используйте \PhpZip\Util\Iterator\IgnoreFilesFilterIterator для не рекурсивного поиска
  415. $ignoreIterator = new \PhpZip\Util\Iterator\IgnoreFilesRecursiveFilterIterator(
  416. $directoryIterator,
  417. $ignoreFiles
  418. );
  419. $zipFile->addFilesFromIterator($ignoreIterator);
  420. ```
  421. <a name="Documentation-ZipFile-addFilesFromGlob"></a> **ZipFile::addFilesFromGlob** - добавляет файлы из директории в соответствии с [glob шаблоном](https://en.wikipedia.org/wiki/Glob_(programming)) без вложенных директорий.
  422. ```php
  423. $globPattern = '**.{jpg,jpeg,png,gif}'; // пример glob шаблона -> добавить все .jpg, .jpeg, .png и .gif файлы
  424. $zipFile->addFilesFromGlob($dir, $globPattern);
  425. // можно указать путь в архиве в который необходимо поместить записи
  426. $localPath = "to/path/";
  427. $zipFile->addFilesFromGlob($dir, $globPattern, $localPath);
  428. // можно указать метод сжатия
  429. $zipFile->addFilesFromGlob($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия
  430. $zipFile->addFilesFromGlob($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие
  431. $zipFile->addFilesFromGlob($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие
  432. ```
  433. <a name="Documentation-ZipFile-addFilesFromGlobRecursive"></a> **ZipFile::addFilesFromGlobRecursive** - добавляет файлы из директории в соответствии с [glob шаблоном](https://en.wikipedia.org/wiki/Glob_(programming)) c вложенными директориями.
  434. ```php
  435. $globPattern = '**.{jpg,jpeg,png,gif}'; // пример glob шаблона -> добавить все .jpg, .jpeg, .png и .gif файлы
  436. $zipFile->addFilesFromGlobRecursive($dir, $globPattern);
  437. // можно указать путь в архиве в который необходимо поместить записи
  438. $localPath = "to/path/";
  439. $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath);
  440. // можно указать метод сжатия
  441. $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия
  442. $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие
  443. $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие
  444. ```
  445. <a name="Documentation-ZipFile-addFilesFromRegex"></a> **ZipFile::addFilesFromRegex** - добавляет файлы из директории в соответствии с [регулярным выражением](https://en.wikipedia.org/wiki/Regular_expression) без вложенных директорий.
  446. ```php
  447. $regexPattern = '/\.(jpe?g|png|gif)$/si'; // пример регулярного выражения -> добавить все .jpg, .jpeg, .png и .gif файлы
  448. $zipFile->addFilesFromRegex($dir, $regexPattern);
  449. // можно указать путь в архиве в который необходимо поместить записи
  450. $localPath = "to/path/";
  451. $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath);
  452. // можно указать метод сжатия
  453. $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия
  454. $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие
  455. $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие
  456. ```
  457. <a name="Documentation-ZipFile-addFilesFromRegexRecursive"></a> **ZipFile::addFilesFromRegexRecursive** - добавляет файлы из директории в соответствии с [регулярным выражением](https://en.wikipedia.org/wiki/Regular_expression) с вложенными директориями.
  458. ```php
  459. $regexPattern = '/\.(jpe?g|png|gif)$/si'; // пример регулярного выражения -> добавить все .jpg, .jpeg, .png и .gif файлы
  460. $zipFile->addFilesFromRegexRecursive($dir, $regexPattern);
  461. // можно указать путь в архиве в который необходимо поместить записи
  462. $localPath = "to/path/";
  463. $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath);
  464. // можно указать метод сжатия
  465. $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия
  466. $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие
  467. $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие
  468. ```
  469. #### <a name="Documentation-Remove-Zip-Entries"></a> Удаление записей из архива
  470. <a name="Documentation-ZipFile-deleteFromName"></a> **ZipFile::deleteFromName** - удаляет запись по имени.
  471. ```php
  472. $zipFile->deleteFromName($entryName);
  473. ```
  474. <a name="Documentation-ZipFile-deleteFromGlob"></a> **ZipFile::deleteFromGlob** - удаляет записи в соответствии с [glob шаблоном](https://en.wikipedia.org/wiki/Glob_(programming)).
  475. ```php
  476. $globPattern = '**.{jpg,jpeg,png,gif}'; // пример glob шаблона -> удалить все .jpg, .jpeg, .png и .gif файлы
  477. $zipFile->deleteFromGlob($globPattern);
  478. ```
  479. <a name="Documentation-ZipFile-deleteFromRegex"></a> **ZipFile::deleteFromRegex** - удаляет записи в соответствии с [регулярным выражением](https://en.wikipedia.org/wiki/Regular_expression).
  480. ```php
  481. $regexPattern = '/\.(jpe?g|png|gif)$/si'; // пример регулярному выражения -> удалить все .jpg, .jpeg, .png и .gif файлы
  482. $zipFile->deleteFromRegex($regexPattern);
  483. ```
  484. <a name="Documentation-ZipFile-deleteAll"></a> **ZipFile::deleteAll** - удаляет все записи в ZIP-архиве.
  485. ```php
  486. $zipFile->deleteAll();
  487. ```
  488. #### <a name="Documentation-Entries"></a> Работа с записями и с архивом
  489. <a name="Documentation-ZipFile-rename"></a> **ZipFile::rename** - переименовывает запись по имени.
  490. ```php
  491. $zipFile->rename($oldName, $newName);
  492. ```
  493. <a name="Documentation-ZipFile-setCompressionLevel"></a> **ZipFile::setCompressionLevel** - устанавливает уровень сжатия для всех файлов, находящихся в архиве.
  494. > _Обратите внимание, что действие данного метода не распространяется на записи, добавленные после выполнения этого метода._
  495. По умолчанию используется уровень сжатия 5 (`\PhpZip\Constants\ZipCompressionLevel::NORMAL`) или уровень сжатия, определённый в архиве для Deflate сжатия.
  496. Поддерживаются диапазон значений от 1 (`\PhpZip\Constants\ZipCompressionLevel::SUPER_FAST`) до 9 (`\PhpZip\Constants\ZipCompressionLevel::MAXIMUM`). Чем выше число, тем лучше и дольше сжатие.
  497. ```php
  498. $zipFile->setCompressionLevel(\PhpZip\Constants\ZipCompressionLevel::MAXIMUM);
  499. ```
  500. <a name="Documentation-ZipFile-setCompressionLevelEntry"></a> **ZipFile::setCompressionLevelEntry** - устанавливает уровень сжатия для определённой записи в архиве.
  501. Поддерживаются диапазон значений от 1 (`\PhpZip\Constants\ZipCompressionLevel::SUPER_FAST`) до 9 (`\PhpZip\Constants\ZipCompressionLevel::MAXIMUM`). Чем выше число, тем лучше и дольше сжатие.
  502. ```php
  503. $zipFile->setCompressionLevelEntry($entryName, \PhpZip\Constants\ZipCompressionLevel::MAXIMUM);
  504. ```
  505. <a name="Documentation-ZipFile-setCompressionMethodEntry"></a> **ZipFile::setCompressionMethodEntry** - устанавливает метод сжатия для определённой записи в архиве.
  506. Доступны следующие методы сжатия:
  507. - `\PhpZip\Constants\ZipCompressionMethod::STORED` - без сжатия
  508. - `\PhpZip\Constants\ZipCompressionMethod::DEFLATED` - Deflate сжатие
  509. - `\PhpZip\Constants\ZipCompressionMethod::BZIP2` - Bzip2 сжатие при наличии расширения `ext-bz2`
  510. ```php
  511. $zipFile->setCompressionMethodEntry($entryName, \PhpZip\Constants\ZipCompressionMethod::DEFLATED);
  512. ```
  513. <a name="Documentation-ZipFile-setArchiveComment"></a> **ZipFile::setArchiveComment** - устанавливает комментарий к ZIP-архиву.
  514. ```php
  515. $zipFile->setArchiveComment($commentArchive);
  516. ```
  517. <a name="Documentation-ZipFile-setEntryComment"></a> **ZipFile::setEntryComment** - устанавливает комментарий к записи, используя её имя.
  518. ```php
  519. $zipFile->setEntryComment($entryName, $comment);
  520. ```
  521. <a name="Documentation-ZipFile-matcher"></a> **ZipFile::matcher** - выборка записей в архиве для проведения операций над выбранными записями.
  522. ```php
  523. $matcher = $zipFile->matcher();
  524. ```
  525. Выбор файлов из архива по одному:
  526. ```php
  527. $matcher
  528. ->add('entry name')
  529. ->add('another entry');
  530. ```
  531. Выбор нескольких файлов в архиве:
  532. ```php
  533. $matcher->add([
  534. 'entry name',
  535. 'another entry name',
  536. 'path/'
  537. ]);
  538. ```
  539. Выбор файлов по регулярному выражению:
  540. ```php
  541. $matcher->match('~\.jpe?g$~i');
  542. ```
  543. Выбор всех файлов в архиве:
  544. ```php
  545. $matcher->all();
  546. ```
  547. count() - получает количество выбранных записей:
  548. ```php
  549. $count = count($matcher);
  550. // или
  551. $count = $matcher->count();
  552. ```
  553. getMatches() - получает список выбранных записей:
  554. ```php
  555. $entries = $matcher->getMatches();
  556. // пример содержимого: ['entry name', 'another entry name'];
  557. ```
  558. invoke() - выполняет пользовательскую функцию над выбранными записями:
  559. ```php
  560. // пример
  561. $matcher->invoke(function($entryName) use($zipFile) {
  562. $newName = preg_replace('~\.(jpe?g)$~i', '.no_optimize.$1', $entryName);
  563. $zipFile->rename($entryName, $newName);
  564. });
  565. ```
  566. Функции для работы над выбранными записями:
  567. ```php
  568. $matcher->delete(); // удалет выбранные записи из ZIP-архива
  569. $matcher->setPassword($password); // устанавливает новый пароль на выбранные записи
  570. $matcher->setPassword($password, $encryptionMethod); // устанавливает новый пароль и метод шифрования на выбранные записи
  571. $matcher->setEncryptionMethod($encryptionMethod); // устанавливает метод шифрования на выбранные записи
  572. $matcher->disableEncryption(); // отключает шифрование для выбранных записей
  573. ```
  574. #### <a name="Documentation-Password"></a> Работа с паролями
  575. Реализована поддержка методов шифрования:
  576. - `\PhpZip\Constants\ZipEncryptionMethod::PKWARE` - Traditional PKWARE encryption
  577. - `\PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_256` - WinZip AES encryption 256 bit (рекомендуемое)
  578. - `\PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_192` - WinZip AES encryption 192 bit
  579. - `\PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_128` - WinZip AES encryption 128 bit
  580. <a name="Documentation-ZipFile-setReadPassword"></a> **ZipFile::setReadPassword** - устанавливает пароль на чтение открытого запароленного архива для всех зашифрованных записей.
  581. > _Установка пароля не является обязательной для добавления новых записей или удаления существующих, но если вы захотите извлечь контент или изменить метод/уровень сжатия, метод шифрования или изменить пароль, то в этом случае пароль необходимо указать._
  582. ```php
  583. $zipFile->setReadPassword($password);
  584. ```
  585. <a name="Documentation-ZipFile-setReadPasswordEntry"></a> **ZipFile::setReadPasswordEntry** - устанавливает пароль на чтение конкретной зашифрованной записи открытого запароленного архива.
  586. ```php
  587. $zipFile->setReadPasswordEntry($entryName, $password);
  588. ```
  589. <a name="Documentation-ZipFile-setPassword"></a> **ZipFile::setPassword** - устанавливает новый пароль для всех файлов, находящихся в архиве.
  590. > _Обратите внимание, что действие данного метода не распространяется на записи, добавленные после выполнения этого метода._
  591. ```php
  592. $zipFile->setPassword($password);
  593. ```
  594. Можно установить метод шифрования:
  595. ```php
  596. $encryptionMethod = \PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_256;
  597. $zipFile->setPassword($password, $encryptionMethod);
  598. ```
  599. <a name="Documentation-ZipFile-setPasswordEntry"></a> **ZipFile::setPasswordEntry** - устанавливает новый пароль для конкретного файла.
  600. ```php
  601. $zipFile->setPasswordEntry($entryName, $password);
  602. ```
  603. Можно установить метод шифрования:
  604. ```php
  605. $encryptionMethod = \PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_256;
  606. $zipFile->setPasswordEntry($entryName, $password, $encryptionMethod);
  607. ```
  608. <a name="Documentation-ZipFile-disableEncryption"></a> **ZipFile::disableEncryption** - отключает шифрования всех записей, находящихся в архиве.
  609. > _Обратите внимание, что действие данного метода не распространяется на записи, добавленные после выполнения этого метода._
  610. ```php
  611. $zipFile->disableEncryption();
  612. ```
  613. <a name="Documentation-ZipFile-disableEncryptionEntry"></a> **ZipFile::disableEncryptionEntry** - отключает шифрование записи по её имени.
  614. ```php
  615. $zipFile->disableEncryptionEntry($entryName);
  616. ```
  617. #### <a name="Documentation-ZipAlign-Usage"></a> zipalign
  618. <a name="Documentation-ZipFile-setZipAlign"></a> **ZipFile::setZipAlign** - устанавливает выравнивание архива для оптимизации APK файлов (Android packages).
  619. Метод добавляет паддинги незашифрованным и не сжатым записям, для оптимизации расхода памяти в системе Android. Рекомендуется использовать для `APK` файлов. Файл может незначительно увеличиться.
  620. Этот метод является альтернативой вызова команды `zipalign -f -v 4 filename.zip`.
  621. Подробнее можно ознакомиться по [ссылке](https://developer.android.com/studio/command-line/zipalign.html).
  622. ```php
  623. // вызовите до сохранения или вывода архива
  624. $zipFile->setZipAlign(4);
  625. ```
  626. #### <a name="Documentation-Unchanged"></a> Отмена изменений
  627. <a name="Documentation-ZipFile-unchangeAll"></a> **ZipFile::unchangeAll** - отменяет все изменения, сделанные в архиве.
  628. ```php
  629. $zipFile->unchangeAll();
  630. ```
  631. <a name="Documentation-ZipFile-unchangeArchiveComment"></a> **ZipFile::unchangeArchiveComment** - отменяет изменения в комментарии к архиву.
  632. ```php
  633. $zipFile->unchangeArchiveComment();
  634. ```
  635. <a name="Documentation-ZipFile-unchangeEntry"></a> **ZipFile::unchangeEntry** - отменяет изменения для конкретной записи архива.
  636. ```php
  637. $zipFile->unchangeEntry($entryName);
  638. ```
  639. #### <a name="Documentation-Save-Or-Output-Entries"></a> Сохранение файла или вывод в браузер
  640. <a name="Documentation-ZipFile-saveAsFile"></a> **ZipFile::saveAsFile** - сохраняет архив в файл.
  641. ```php
  642. $zipFile->saveAsFile($filename);
  643. ```
  644. <a name="Documentation-ZipFile-saveAsStream"></a> **ZipFile::saveAsStream** - записывает архив в поток.
  645. ```php
  646. // $fp = fopen($filename, 'w+b');
  647. $zipFile->saveAsStream($fp);
  648. ```
  649. <a name="Documentation-ZipFile-outputAsString"></a> **ZipFile::outputAsString** - выводит ZIP-архив в виде строки.
  650. ```php
  651. $rawZipArchiveBytes = $zipFile->outputAsString();
  652. ```
  653. <a name="Documentation-ZipFile-outputAsAttachment"></a> **ZipFile::outputAsAttachment** - выводит ZIP-архив в браузер.
  654. При выводе устанавливаются необходимые заголовки, а после вывода завершается работа скрипта.
  655. ```php
  656. $zipFile->outputAsAttachment($outputFilename);
  657. ```
  658. Можно установить MIME-тип:
  659. ```php
  660. $mimeType = 'application/zip'
  661. $zipFile->outputAsAttachment($outputFilename, $mimeType);
  662. ```
  663. <a name="Documentation-ZipFile-outputAsResponse"></a> **ZipFile::outputAsResponse** - выводит ZIP-архив, как Response [PSR-7](http://www.php-fig.org/psr/psr-7/).
  664. Метод вывода может использоваться в любом PSR-7 совместимом фреймворке.
  665. ```php
  666. // $response = ....; // instance Psr\Http\Message\ResponseInterface
  667. $zipFile->outputAsResponse($response, $outputFilename);
  668. ```
  669. Можно установить MIME-тип:
  670. ```php
  671. $mimeType = 'application/zip'
  672. $zipFile->outputAsResponse($response, $outputFilename, $mimeType);
  673. ```
  674. Пример для Slim Framework:
  675. ```php
  676. $app = new \Slim\App;
  677. $app->get('/download', function ($req, $res, $args) {
  678. $zipFile = new \PhpZip\ZipFile();
  679. $zipFile['file.txt'] = 'content';
  680. return $zipFile->outputAsResponse($res, 'file.zip');
  681. });
  682. $app->run();
  683. ```
  684. <a name="Documentation-ZipFile-rewrite"></a> **ZipFile::rewrite** - сохраняет изменения и заново открывает изменившийся архив.
  685. ```php
  686. $zipFile->rewrite();
  687. ```
  688. #### <a name="Documentation-Close-Zip-Archive"></a> Закрытие архива
  689. <a name="Documentation-ZipFile-close"></a> **ZipFile::close** - закрывает ZIP-архив.
  690. ```php
  691. $zipFile->close();
  692. ```
  693. ### <a name="Running-Tests"></a> Запуск тестов
  694. Установите зависимости для разработки.
  695. ```bash
  696. composer install --dev
  697. ```
  698. Запустите тесты:
  699. ```bash
  700. vendor/bin/phpunit -v -c phpunit.xml
  701. ```
  702. ### <a name="Changelog"></a> История изменений
  703. История изменений на [странице релизов](https://github.com/Ne-Lexa/php-zip/releases).
  704. ### <a name="Upgrade"></a> Обновление версий
  705. #### <a name="Upgrade-v2-to-v3"></a> Обновление с версии 2 до версии 3.0
  706. Обновите мажорную версию в файле `composer.json` до `^3.0`.
  707. ```json
  708. {
  709. "require": {
  710. "nelexa/zip": "^3.0"
  711. }
  712. }
  713. ```
  714. Затем установите обновления с помощью `Composer`:
  715. ```bash
  716. composer update nelexa/zip
  717. ```
  718. Обновите ваш код для работы с новой версией:
  719. - Класс `ZipOutputFile` объединён с `ZipFile` и удалён.
  720. + Замените `new \PhpZip\ZipOutputFile()` на `new \PhpZip\ZipFile()`
  721. - Статичиская инициализация методов стала не статической.
  722. + Замените `\PhpZip\ZipFile::openFromFile($filename);` на `(new \PhpZip\ZipFile())->openFile($filename);`
  723. + Замените `\PhpZip\ZipOutputFile::openFromFile($filename);` на `(new \PhpZip\ZipFile())->openFile($filename);`
  724. + Замените `\PhpZip\ZipFile::openFromString($contents);` на `(new \PhpZip\ZipFile())->openFromString($contents);`
  725. + Замените `\PhpZip\ZipFile::openFromStream($stream);` на `(new \PhpZip\ZipFile())->openFromStream($stream);`
  726. + Замените `\PhpZip\ZipOutputFile::create()` на `new \PhpZip\ZipFile()`
  727. + Замените `\PhpZip\ZipOutputFile::openFromZipFile($zipFile)` на `(new \PhpZip\ZipFile())->openFile($filename);`
  728. - Переименуйте методы:
  729. + `addFromFile` в `addFile`
  730. + `setLevel` в `setCompressionLevel`
  731. + `ZipFile::setPassword` в `ZipFile::withReadPassword`
  732. + `ZipOutputFile::setPassword` в `ZipFile::withNewPassword`
  733. + `ZipOutputFile::disableEncryptionAllEntries` в `ZipFile::withoutPassword`
  734. + `ZipOutputFile::setComment` в `ZipFile::setArchiveComment`
  735. + `ZipFile::getComment` в `ZipFile::getArchiveComment`
  736. - Изменились сигнатуры для методов `addDir`, `addFilesFromGlob`, `addFilesFromRegex`.
  737. - Удалены методы:
  738. + `getLevel`
  739. + `setCompressionMethod`
  740. + `setEntryPassword`