- ZIP в PHP (ZipArchive)
- Добавление файлов в архив
- Заархивировать директорию с содержимым
- Переименовать файл
- Если файл лежит в папке
- Удалить файл из архива
- Если файл лежит в папке
- Список файлов в архиве
- Извлечь весь архив
- Извлечь определенные файлы
- Извлечь файл в поток
- Примеры
- User Contributed Notes 5 notes
- Php как заархивировать файлы
- Фильтрация данных с помощью zend-filter
- Контекстное экранирование с помощью zend-escaper
- Подключение Zend модулей к Expressive
- Совет: отправка информации в Google Analytics через API
- Подборка PHP песочниц
- Совет: активация отображения всех ошибок в PHP
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();
Примеры
$zip -> addFromString ( «testfilephp.txt» . time (), «#1 Это тестовая строка добавляется в качестве testfilephp.txt.\n» );
$zip -> addFromString ( «testfilephp2.txt» . time (), «#2 Это тестовая строка добавляется в качестве testfilephp2.txt.\n» );
$zip -> addFile ( $thisdir . «/too.php» , «/testfromfile.php» );
echo «numfiles: » . $zip -> numFiles . «\n» ;
echo «status:» . $zip -> status . «\n» ;
$zip -> close ();
?>
Пример #2 Собрать и отобразить подробную информацию об архиве
$za -> open ( ‘test_with_comment.zip’ );
print_r ( $za );
var_dump ( $za );
echo «numFiles: » . $za -> numFiles . «\n» ;
echo «status: » . $za -> status . «\n» ;
echo «statusSys: » . $za -> statusSys . «\n» ;
echo «filename: » . $za -> filename . «\n» ;
echo «comment: » . $za -> comment . «\n» ;
for ( $i = 0 ; $i < $za ->numFiles ; $i ++) echo «index: $i \n» ;
print_r ( $za -> statIndex ( $i ));
>
echo «numFile:» . $za -> numFiles . «\n» ;
?>
Пример #3 Использование обёртки потока Zip, чтение метаинформации OpenOffice
$reader -> open ( ‘zip://’ . dirname ( __FILE__ ) . ‘/test.odt#meta.xml’ );
$odt_meta = array();
while ( $reader -> read ()) if ( $reader -> nodeType == XMLREADER :: ELEMENT ) $elm = $reader -> name ;
> else if ( $reader -> nodeType == XMLREADER :: END_ELEMENT && $reader -> name == ‘office:meta’ ) break;
>
if (! trim ( $reader -> value )) continue;
>
$odt_meta [ $elm ] = $reader -> value ;
>
>
print_r ( $odt_meta );
?>
Этот пример использует старую версию API (PHP 4), он открывает ZIP-архив, читает каждый файл в архиве и выводит его содержимое. Архив test2.zip , использованный в этом примере, является одним из тестовых архивов исходного дистрибутива ZZIPlib.
Пример #4 Пример использования Zip
$zip = zip_open ( «/tmp/test2.zip» );
if ( $zip ) while ( $zip_entry = zip_read ( $zip )) echo «Название: » . zip_entry_name ( $zip_entry ) . «\n» ;
echo «Исходный размер: » . zip_entry_filesize ( $zip_entry ) . «\n» ;
echo «Сжатый размер: » . zip_entry_compressedsize ( $zip_entry ) . «\n» ;
echo «Метод сжатия: » . zip_entry_compressionmethod ( $zip_entry ) . «\n» ;
if ( zip_entry_open ( $zip , $zip_entry , «r» )) echo «Содержимое файла:\n» ;
$buf = zip_entry_read ( $zip_entry , zip_entry_filesize ( $zip_entry ));
echo » $buf \n» ;
zip_entry_close ( $zip_entry );
>
echo «\n» ;
User Contributed Notes 5 notes
All these examples will not work if the php script has no write access within the folder.
Although you may say this is obvious, I found that in this case, $zip->open(«name», ZIPARCHIVE::CREATE) doesn’t return an error as it might not try to access the file system but rather allocates memory.
It is only $zip->close() that returns the error. This might cause you seeking at the wrong end.
you can use this code for reading JAR files (java archives)
JAR files use the same ZIP format, so can be easily read
$zf = zip_open(realpath(‘D:/lucene/allinone/lucene-core.jar’)); $i=1;
while($zf && $ze = zip_read($zf)) $zi[$i][‘zip entry name’]= zip_entry_name($ze);
$zi[$i][‘zip entry filesize’]= zip_entry_filesize($ze);
$zi[$i][‘zip entry compressed size’]= zip_entry_compressedsize($ze);
$zi[$i][‘zip entry compression method’]= zip_entry_compressionmethod($ze);
$zi[$i][‘zip entry open status’] = zip_entry_open($zf,$ze);
//$zi[$i][‘zip entry file contents’] = zip_entry_read($ze,100);
$i++;
>
print_r($zi);
zip_close($zf);
$zip = new ZipArchive ;
$zip -> open ( ‘teste.zip’ );
$zip -> extractTo ( ‘./’ );
$zip -> close ();
echo «Ok!» ;
?>?php>
1) If you want to add files to a ZIP archive but you don’t know if the ZiP file exists or not, you MUST check: this changes the way you open it !.
2) you can not append multiple flags, can use only one (or none).
If the zip does not exists, open it with:
$ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE)
(or a different compression method)
If the zip already exists, open it with:
$ziph->open($archiveFile)
or
$ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS)
Example: make backup files every hour and ZIP them all in a daily ZIP archive, so you want to get only one ZIP per day, each ZIP containing 24 files:
function archivebackup ( $archiveFile , $file , & $errMsg )
$ziph = new ZipArchive ();
if( file_exists ( $archiveFile ))
if( $ziph -> open ( $archiveFile , ZIPARCHIVE :: CHECKCONS ) !== TRUE )
$errMsg = «Unable to Open $archiveFile » ;
return 1 ;
>
>
else
if( $ziph -> open ( $archiveFile , ZIPARCHIVE :: CM_PKWARE_IMPLODE ) !== TRUE )
$errMsg = «Could not Create $archiveFile » ;
return 1 ;
>
>
if(! $ziph -> addFile ( $file ))
$errMsg = «error archiving $file in $archiveFile » ;
return 2 ;
>
$ziph -> close ();
If you find your zip file not being created make sure every file you are adding to the zip is valid. If even one file is not available when zip->close is called then the archive will fail and your zip file won’t be created.
Php как заархивировать файлы
В этом разделе помещены уроки по PHP скриптам, которые Вы сможете использовать на своих ресурсах.
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Совет: активация отображения всех ошибок в PHP
При поднятии PHP проекта на новом рабочем окружении могут возникнуть ошибки отображение которых изначально скрыто базовыми настройками. Это можно исправить, прописав несколько команд.