Меню Рубрики

Установка php модуль zip

Установка Расширения PHP Zip

Я пытаюсь установить расширение PHP Zip.

Мой сервер не имеет внешнего доступа в интернет, поэтому я сам скачал его с PECL: http://pecl.php.net/package/zip . Я выбрал 1.10.2, последнюю версию «stable», и перенес ее на свой сервер.

к php.ini, как и было сказано. Я вижу, что zip.so был создан и помещен в нужную папку extension_dir. Я перезапустил apache и затем проверил, был ли он загружен при запуске:

Несмотря на все это, «zip» все еще не входит в этот список.

Может быть, я пропустил шаг или делаю что-то не так? Я думал, что это должно быть очень просто, и я начинаю чувствовать себя довольно глупо, ха-ха.

Другие вероятно важные вещи:

CentOS Apache 2.2.3 PHP 5.2.16

6 Ответов

Вот как я установил его на свою машину (ubuntu):

Редактировать:
После этого обязательно перезагрузите сервер.

sudo /etc/init.d/apache2 restart или sudo service nginx restart

PS: если вы используете centOS, пожалуйста, проверьте выше ответ cweiske ‘s
Но если вы используете Debian производный OS, это решение должно помочь вам установить расширение php zip.

У вас может быть несколько файлов php.ini , один для CLI и один для apache. Запустите php —ini , чтобы узнать, где находится CLI ini местоположение.

1 шаг- установите необходимое расширение

2 Шаг- установите расширение PHP

3 Шаг- перезагрузите Apache

Если не работает, вы можете проверить, вызывается ли zip.ini в вашем phpinfo, чтобы проверить, был ли включен zip.so.

Если вы используете php5.6, то выполните это:

sudo apt-get install php5.6-zip

если sudo apt-get install php5.6-zip не работает, попробуйте sudo apt-get update , а затем попробуйте sudo apt-get install php5.6-zip

Просто используйте sudo apt-get install php-zip

Похожие вопросы:

Мне просто любопытен процесс установки расширения, потому что я пытаюсь установить расширение uploadprogress php на Ubuntu. У меня есть установка по умолчанию php в моем каталоге usr/, но у меня.

Я столкнулся с проблемой отправки файла, который на самом деле является файлом zip, содержащим некоторые отчеты с использованием файлов js. Ранее, как мы знаем, Gmail заблокировал некоторые.

Мне нужно распаковать загруженный контент. Но в целях безопасности необходимо проверить, что файлы являются только файлами изображений, чтобы кто-то не мог добавить php в zip, а затем запустить его.

Я пытаюсь запустить этот код $files = array(‘readme.txt’, ‘test.html’, ‘image.gif’); $zip = new ZipFile; $zip->open(‘file.zip’, ZipArchive::CREATE); foreach ($files as $file) <.

Я установил pecl/solr с помощью команды, pecl install solr и pear использование wget http://pear.php.net/go-pear.phar php go-pear.phar После перезагрузки Apache , я все еще получаю ошибку Fatal.

Существует ли какой-либо способ распаковать или извлечь файл zip с PHP, который не зависит от установленного расширения? Кто-нибудь написал класс или что-то, что может справиться с этим? Кроме того.

Я пытаюсь установить расширение в Chrome, и когда я нажимаю на кнопку install, то zip файл загружается не тот .КРХ. Как установить файл zip в качестве расширения chrome ? Пожалуйста помочь.

Как я могу проверить, архивируется ли файл (zip или rar), не зная расширения. Мне нужно найти его, используя php. Я не могу использовать Fileinfo, потому что он не установлен и установка каких-либо.

Я попытался создать пустой / не пустой архив zip. Код, используемый ниже. Результат: ничего не произошло. Никаких ошибок, но и никаких результатов. Любое объяснение ценится. $zip = new ZipArchive();.

источник

Установка PHP и модулей на Ubuntu/Debian

В Debian и Ubuntu есть несколько вариантов работы php: как модуль apache и как php-fpm. Первый вариант удобен тем, кому придется использовать не только сам PHP, но и возможности Apache, такие как .htaccess. Второй же вариат удобен например для Yii или Laravel.

Установка PHP 5 как модуля Apache:

Установка PHP 7 как модуля Apache:

Установка PHP 5 как PHP-FPM:

Установка PHP 7 как PHP-FPM

В Debian и Ubuntu зачастую установка модулей PHP не требует каких-то сложных манипуляций. Для того, чтобы посмотреть, что Вы можете поставить прямо сейчас, нужно сделать:

Давайте для примера установим GD для работы с изображениями:

Либо php-fpm, смотря, что используете Вы:

Чтобы посмотреть список модулей php, который прямо сейчас подключен, можно запустить:

Nginx, Php-Fpm и что это вообще?

Что такое php-fpm и зачем он нужен более-менее посещаемым проектам? Какие неприятности несет в себе переход с apache на fpm? Какие проблемы решает реально, а какие — надуманно?

Почему timeout для curl в php необходим

Использование cURL в PHP имеет свою не очень приятную особенность — вечная блокировка процесса

Угадайте самый медленный фреймворк. И это не Laravel

Есть распространенное мнение, что Laravel почти самый медленный фреймворк, что даже его название нужно читать медленно и только одним пользователем на 1 ядро CPU. Но к счастью, это не так

Curl в PHP

Curl — это библиотека для работы с URL. Она интегрирована во множество языков, в том числе и в PHP.

Сессии в PHP — часть первая для Чайников

Вводная статья о том, как использовать сессии в PHP

IoT Highload: особенности и подводные камни

Особенности серверных приложений, работающих с сетью IoT-устройств на практике и в теории

источник

zip_open

(PHP 4 >= 4.1.0, PHP 5 >= 5.2.0, PHP 7, PECL zip >= 1.0.0)

zip_open — Открывает ZIP-архив

Описание

Открывает ZIP-архив для чтения.

Список параметров

Имя файла ZIP-архива для открытия.

Возвращаемые значения

Возвращает ссылку на ресурс для последующего использования с функциями zip_read() и zip_close() либо возвращает номер ошибки, если filename не существует или в случае другой ошибки.

Смотрите также

  • zip_read() — Считывает следующую запись в ZIP-архиве
  • zip_close() — Закрывает дескриптор ZIP-архива

User Contributed Notes 13 notes

Note that the Zip functions return an integer error number in the event of error. So:

if ( $zip ) <
?>

is incorrect. Instead use:

getting a mozilla addon version (a firefox extension, for instance):

function get_addon_version ( $path )
<
// open zip
$zip = zip_open ( $path );

// open entry
zip_entry_open ( $zip , $entry , «r» );

// read entry
$entry_content = zip_entry_read ( $entry , zip_entry_filesize ( $entry ));

// position of
$version_open_pos = strpos ( $entry_content , » » );

// position of
$version_close_pos = strpos ( $entry_content , » » , $version_open_pos );

// version
$version = substr (
$entry_content ,
$version_open_pos + strlen ( » » ),
$version_close_pos — ( $version_open_pos + strlen ( » » ))
);

// close entry
zip_entry_close ( $entry );

If your PHP installation does not have the zip_open function, and you can’t install it for whatever reason, you can use these functions instead, if the server has access to the «unzip» utility (most Linux systems do).
So far I have tested these only in Fedora Core 3.
Use at your own risk.

function ShellFix ( $s )
<
return «‘» . str_replace ( «‘» , «‘\»» , $s ). «‘» ;
>

function zip_open ( $s )
<
$fp = @ fopen ( $s , ‘rb’ );
if(! $fp ) return false ;

$lines = Array();
$cmd = ‘unzip -v ‘ . shellfix ( $s );
exec ( $cmd , $lines );

$contents = Array();
$ok = false ;
foreach( $lines as $line )
<
if( $line [ 0 ]== ‘-‘ ) < $ok =! $ok ; continue; >
if(! $ok ) continue;

$length = (int) $line ;
$fn = trim ( substr ( $line , 58 ));

$contents [] = Array( ‘name’ => $fn , ‘length’ => $length );
>

$next = $fp [ ‘pointer’ ] + 1 ;
if( $next >= count ( $fp [ ‘contents’ ])) return false ;

$cmd = ‘unzip -p ‘ . shellfix ( $fp [ ‘name’ ]). ‘ ‘ . shellfix ( $res [ ‘name’ ]);

The zip_entry_read above is wrong. Since the file was opened with popen, you have to read the file in chunks, so zip_entry_read should read:

Otherwise, it was a very useful library. Thanks!

The zip archive will NOT be saved on disk before ZipArchive::close() is called. (ZipArchive::close will be called automatically at the end of the script if you don’t write that code.)

If you want to delete a file after adding it to the zip archive, you should delete it after ZipArchive::close() is called. Otherwise, the file will be deleted before actually being added into the archive, which will make your zip archive fail to be saved.

= new ZipArchive ();
$za -> open ( ‘./xc.zip’ , ZipArchive :: CREATE | ZipArchive :: OVERWRITE );
$file = ‘./notes.txt’ ;
if( true === $za -> addFile ( $file )) <
unlink ( $file );
>
if(! $za -> close ()) <
echo ‘failure.’ ;
>
?>

For bisqwit at iki dot fi solution of alternative functions there’s just one problem when trying to read the file thats because some bug in fread when handling from popen so it just load 8192 bytes here’s the function corrected.

Function zip_entry_read() written by «bisqwit at iki dot fi» has to be modified to read entire files:

Some older PHP versions used to return false if zip_open failed, and newer versions return the number of error (as integer), so instead of this:

$zip = zip_open($zip_file);
if ($zip) <
// consider zip file opened successfully
>

$zip = zip_open($zip_file);
if (is_resource($zip)) <
// consider zip file opened successfully
>

You may also use this function to get the error message by it’s number:

function zipFileErrMsg($errno) <
// using constant name as a string to make this function PHP4 compatible
$zipFileFunctionsErrors = array(
‘ZIPARCHIVE::ER_MULTIDISK’ => ‘Multi-disk zip archives not supported.’,
‘ZIPARCHIVE::ER_RENAME’ => ‘Renaming temporary file failed.’,
‘ZIPARCHIVE::ER_CLOSE’ => ‘Closing zip archive failed’,
‘ZIPARCHIVE::ER_SEEK’ => ‘Seek error’,
‘ZIPARCHIVE::ER_READ’ => ‘Read error’,
‘ZIPARCHIVE::ER_WRITE’ => ‘Write error’,
‘ZIPARCHIVE::ER_CRC’ => ‘CRC error’,
‘ZIPARCHIVE::ER_ZIPCLOSED’ => ‘Containing zip archive was closed’,
‘ZIPARCHIVE::ER_NOENT’ => ‘No such file.’,
‘ZIPARCHIVE::ER_EXISTS’ => ‘File already exists’,
‘ZIPARCHIVE::ER_OPEN’ => ‘Can\’t open file’,
‘ZIPARCHIVE::ER_TMPOPEN’ => ‘Failure to create temporary file.’,
‘ZIPARCHIVE::ER_ZLIB’ => ‘Zlib error’,
‘ZIPARCHIVE::ER_MEMORY’ => ‘Memory allocation failure’,
‘ZIPARCHIVE::ER_CHANGED’ => ‘Entry has been changed’,
‘ZIPARCHIVE::ER_COMPNOTSUPP’ => ‘Compression method not supported.’,
‘ZIPARCHIVE::ER_EOF’ => ‘Premature EOF’,
‘ZIPARCHIVE::ER_INVAL’ => ‘Invalid argument’,
‘ZIPARCHIVE::ER_NOZIP’ => ‘Not a zip archive’,
‘ZIPARCHIVE::ER_INTERNAL’ => ‘Internal error’,
‘ZIPARCHIVE::ER_INCONS’ => ‘Zip archive inconsistent’,
‘ZIPARCHIVE::ER_REMOVE’ => ‘Can\’t remove file’,
‘ZIPARCHIVE::ER_DELETED’ => ‘Entry has been deleted’,
);
$errmsg = ‘unknown’;
foreach ($zipFileFunctionsErrors as $constName => $errorMessage) <
if (defined($constName) and constant($constName) === $errno) <
return ‘Zip File Function error: ‘.$errorMessage;
>
>
return ‘Zip File Function error: unknown’;
>

$zip = zip_open($zip_file);
if (!is_resource($zip)) <
die(zipFileErrMsg($zip));
>

See this class to make, read Infos or extract ZIP archive.
see EasyArchive.class.php on http://ajaxbrowser.free.fr/ to manage like that ZIP, GZIP, BZIP and TAR archive.

makeZip(‘./’,’./toto.zip’); // make an ZIP archive
var_export($ARCHIVE->infosZip(‘./toto.zip’), false); // get infos of this ZIP archive (without files content)
var_export($ARCHIVE->infosZip(‘./toto.zip’)); // get infos of this ZIP archive (with files content)
$ARCHIVE->extractZip(‘./toto.zip’, ‘./1/’); //

class zip
<
public function infosZip ($src, $data=true)
<
if (($zip = zip_open(realpath($src))))
<
while (($zip_entry = zip_read($zip)))
<
$path = zip_entry_name($zip_entry);
if (zip_entry_open($zip, $zip_entry, «r»))
<
$content[$path] = array (
‘Ratio’ => zip_entry_filesize($zip_entry) ? round(100-zip_entry_compressedsize($zip_entry) / zip_entry_filesize($zip_entry)*100, 1) : false,
‘Size’ => zip_entry_compressedsize($zip_entry),
‘NormalSize’ => zip_entry_filesize($zip_entry));
if ($data)
$content[$path][‘Data’] = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
zip_entry_close($zip_entry);
>
else
$content[$path] = false;
>
zip_close($zip);
return $content;
>
return false;
>
public function extractZip ($src, $dest)
<
$zip = new ZipArchive;
if ($zip->open($src)===true)
<
$zip->extractTo($dest);
$zip->close();
return true;
>
return false;
>
public function makeZip ($src, $dest)
<
$zip = new ZipArchive;
$src = is_array($src) ? $src : array($src);
if ($zip->open($dest, ZipArchive::CREATE) === true)
<
foreach ($src as $item)
if (file_exists($item))
$this->addZipItem($zip, realpath(dirname($item)).’/’, realpath($item).’/’);
$zip->close();
return true;
>
return false;
>
private function addZipItem ($zip, $racine, $dir)
<
if (is_dir($dir))
<
$zip->addEmptyDir(str_replace($racine, », $dir));
$lst = scandir($dir);
array_shift($lst);
array_shift($lst);
foreach ($lst as $item)
$this->addZipItem($zip, $racine, $dir.$item.(is_dir($dir.$item)?’/’:»));
>
elseif (is_file($dir))
$zip->addFile($dir, str_replace($racine, », $dir));
>
>
?>

my basic extract zip file function

function ezip ( $zip , $hedef = » )
<
$root = $_SERVER [ ‘DOCUMENT_ROOT’ ];
$zip = zip_open ( $root . $zip );
while( $zip_icerik = zip_read ( $zip )):
$zip_dosya = zip_entry_name ( $zip_icerik );
if( strpos ( $zip_dosya , ‘.’ )):
$hedef_yol = $root . $hedef . ‘x/’ . $zip_dosya ;
touch ( $hedef_yol );
$yeni_dosya = fopen ( $hedef_yol , ‘w+’ );
fwrite ( $yeni_dosya , zip_entry_read ( $zip_icerik ));
fclose ( $yeni_dosya );
else:
@ mkdir ( $root . $hedef . ‘x/’ . $zip_dosya );
endif;
endwhile;
>

ezip ( ‘files.zip’ , ‘unzip_files/’ );
?>

If you want to simply extract a strain of a zip file, then use this func. Maybe it helps:

/**
* This method unzips a directory within a zip-archive
*
* @author Florian ‘x!sign.dll’ Wolf
* @license LGPL v2 or later
* @link http://www.xsigndll.de
* @link http://www.clansuite.com
*/

function extractZip ( $zipFile = » , $dirFromZip = » )
<
define ( DIRECTORY_SEPARATOR , ‘/’ );

$zipDir = getcwd () . DIRECTORY_SEPARATOR ;
$zip = zip_open ( $zipDir . $zipFile );

if ( $zip )
<
while ( $zip_entry = zip_read ( $zip ))
<
$completePath = $zipDir . dirname ( zip_entry_name ( $zip_entry ));
$completeName = $zipDir . zip_entry_name ( $zip_entry );

// Walk through path to create non existing directories
// This won’t apply to empty directories ! They are created further below
if(! file_exists ( $completePath ) && preg_match ( ‘#^’ . $dirFromZip . ‘.*#’ , dirname ( zip_entry_name ( $zip_entry )) ) )
<
$tmp = » ;
foreach( explode ( ‘/’ , $completePath ) AS $k )
<
$tmp .= $k . ‘/’ ;
if(! file_exists ( $tmp ) )
<
@ mkdir ( $tmp , 0777 );
>
>
>

if ( zip_entry_open ( $zip , $zip_entry , «r» ))
<
if( preg_match ( ‘#^’ . $dirFromZip . ‘.*#’ , dirname ( zip_entry_name ( $zip_entry )) ) )
<
if ( $fd = @ fopen ( $completeName , ‘w+’ ))
<
fwrite ( $fd , zip_entry_read ( $zip_entry , zip_entry_filesize ( $zip_entry )));
fclose ( $fd );
>
else
<
// We think this was an empty directory
mkdir ( $completeName , 0777 );
>
zip_entry_close ( $zip_entry );
>
>
>
zip_close ( $zip );
>
return true ;
>

источник

Класс ZipArchive

(PHP 5 >= 5.2.0, PHP 7, PECL zip >= 1.1.0)

Введение

Файловый архив, сжатый Zip.

Обзор классов

Свойства

Значение индекса последней добавленной записи (файл или каталог). Доступно с PHP 8.0.0 и PECL zip 1.18.0.

Статус Zip-архива. Доступно для закрытого архива, начиная с PHP 8.0.0 и PECL zip 1.18.0.

Системный статус Zip-архива. Доступно для закрытого архива, начиная с PHP 8.0.0 и PECL zip 1.18.0.

Количество файлов в архиве

Имя файла в файловой системе

Содержание

  • ZipArchive::addEmptyDir — Добавляет новую директорию
  • ZipArchive::addFile — Добавляет в ZIP-архив файл по указанному пути
  • ZipArchive::addFromString — Добавляет файл в ZIP-архив, используя его содержимое
  • ZipArchive::addGlob — Добавить файлы из директории в соответствии с шаблоном
  • ZipArchive::addPattern — Добавить файлы из директории в соответствии с шаблоном регулярного выражения PCRE
  • ZipArchive::close — Закрывает активный архив (открытый или вновь созданный)
  • ZipArchive::count — Подсчитывает количество файлов в архиве
  • ZipArchive::deleteIndex — Удаляет элемент в архиве, используя его индекс
  • ZipArchive::deleteName — Удаляет элемент в архиве, используя его имя
  • ZipArchive::extractTo — Извлекает содержимое архива
  • ZipArchive::getArchiveComment — Возвращает комментарий ZIP-архива
  • ZipArchive::getCommentIndex — Возвращает комментарий элемента, используя его индекс
  • ZipArchive::getCommentName — Возвращает комментарий элемента, используя его имя
  • ZipArchive::getExternalAttributesIndex — Извлечь внешние атрибуты записи по ее индексу
  • ZipArchive::getExternalAttributesName — Извлечь внешние атрибуты записи по ее имени
  • ZipArchive::getFromIndex — Возвращает содержимое элемента по его индексу
  • ZipArchive::getFromName — Возвращает содержимое элемента по его имени
  • ZipArchive::getNameIndex — Возвращает имя элемента по его индексу
  • ZipArchive::getStatusString — Возвращают статус сообщения об ошибке, системный и/или zip-статус
  • ZipArchive::getStream — Получить дескриптор файла элемента, определенный по имени элемента (только для чтения)
  • ZipArchive::locateName — Возвращает индекс элемента в архиве
  • ZipArchive::open — Открывает ZIP-архив
  • ZipArchive::registerCancelCallback — Register a callback to allow cancellation during archive close.
  • ZipArchive::registerProgressCallback — Register a callback to provide updates during archive close.
  • ZipArchive::renameIndex — Переименовывает элемент по его индексу
  • ZipArchive::renameName — Переименовывает элемент по его имени
  • ZipArchive::replaceFile — Replace file in ZIP archive with a given path
  • ZipArchive::setArchiveComment — Устанавливает комментарий к ZIP-архиву
  • ZipArchive::setCommentIndex — Устанавливает комментарий к элементу по его индексу
  • ZipArchive::setCommentName — Устанавливает комментарий к элементу, заданному по имени
  • ZipArchive::setCompressionIndex — Установить метод сжатия записи, заданной ее индексом
  • ZipArchive::setCompressionName — Установить метод сжатия записи, заданной по имени
  • ZipArchive::setEncryptionIndex — Установить метод шифрования записи по ее индексу
  • ZipArchive::setEncryptionName — Установить метод шифрования записи по ее имени
  • ZipArchive::setExternalAttributesIndex — Установить внешние атрибуты записи по ее индексу
  • ZipArchive::setExternalAttributesName — Установка внешних атрибутов записи, заданной по имени
  • ZipArchive::setMtimeIndex — Установить время модификации файла по его индексу
  • ZipArchive::setMtimeName — Установить время модификации файла по его имени
  • ZipArchive::setPassword — Установка пароля для активного архива
  • ZipArchive::statIndex — Получение детальной информации о элементе по его индексу
  • ZipArchive::statName — Получение детальной информации о элементе по его имени
  • ZipArchive::unchangeAll — Отменяет все изменения, сделанные в архиве
  • ZipArchive::unchangeArchive — Возвращает все глобальные изменения, сделанные в архиве
  • ZipArchive::unchangeIndex — Отменяет все изменения у позиции с заданным индексом
  • ZipArchive::unchangeName — Отменяет все измения у позиции с заданным именем

User Contributed Notes 15 notes

Zip a folder (include itself).
Usage:
HZip::zipDir(‘/path/to/sourceDir’, ‘/path/to/out.zip’);

class HZip
<
/**
* Add files and sub-directories in a folder to zip file.
* @param string $folder
* @param ZipArchive $zipFile
* @param int $exclusiveLength Number of text to be exclusived from the file path.
*/
private static function folderToZip ( $folder , & $zipFile , $exclusiveLength ) <
$handle = opendir ( $folder );
while ( false !== $f = readdir ( $handle )) <
if ( $f != ‘.’ && $f != ‘..’ ) <
$filePath = » $folder / $f » ;
// Remove prefix from file path before add to zip.
$localPath = substr ( $filePath , $exclusiveLength );
if ( is_file ( $filePath )) <
$zipFile -> addFile ( $filePath , $localPath );
> elseif ( is_dir ( $filePath )) <
// Add sub-directory.
$zipFile -> addEmptyDir ( $localPath );
self :: folderToZip ( $filePath , $zipFile , $exclusiveLength );
>
>
>
closedir ( $handle );
>

/**
* Zip a folder (include itself).
* Usage:
* HZip::zipDir(‘/path/to/sourceDir’, ‘/path/to/out.zip’);
*
* @param string $sourcePath Path of directory to be zip.
* @param string $outZipPath Path of output zip file.
*/
public static function zipDir ( $sourcePath , $outZipPath )
<
$pathInfo = pathInfo ( $sourcePath );
$parentPath = $pathInfo [ ‘dirname’ ];
$dirName = $pathInfo [ ‘basename’ ];

$z = new ZipArchive ();
$z -> open ( $outZipPath , ZIPARCHIVE :: CREATE );
$z -> addEmptyDir ( $dirName );
self :: folderToZip ( $sourcePath , $z , strlen ( » $parentPath /» ));
$z -> close ();
>
>
?>

With PHP 5.6+, you may come up with theses errors.

Warning: Unknown: Cannot destroy the zip context in Unknown on line 0

Warning: ZipArchive::close(): Can’t remove file: No such file or directory in xxxx.php on line xx

Warning: Unknown: Cannot destroy the zip context in Unknown on line 0

= new ZipArchive ;
$za -> open ( ’51-n.com.zip’ , ZipArchive :: CREATE | ZipArchive :: OVERWRITE );
?>

Warning: ZipArchive::close(): Can’t remove file: No such file or directory in xxxx.php on line xx

= new ZipArchive ;
$za -> open ( ’51-n.com.zip’ , ZipArchive :: CREATE | ZipArchive :: OVERWRITE );
$za -> close ();
?>

It happens when the zip archive is empty.
Your zip archive will not be saved on disk unless it has at least one file. What’s more, when ZipArchive::OVERWRITE is applied, if there exists a file with the same name, it will be removed after ZipArchive::open() is called.

So, don’t forget to put at least one file to your zip archive.

= new ZipArchive ;
$za -> open ( ’51-n.com.zip’ , ZipArchive :: CREATE | ZipArchive :: OVERWRITE );
$za -> addFromString ( ‘wuxiancheng.cn.txt’ , ‘yes’ );
$za -> close ();
?>

There is a usefull function to get the ZipArchive status as a human readable string :

function ZipStatusString ( $status )
<
switch( (int) $status )
<
case ZipArchive :: ER_OK : return ‘N No error’ ;
case ZipArchive :: ER_MULTIDISK : return ‘N Multi-disk zip archives not supported’ ;
case ZipArchive :: ER_RENAME : return ‘S Renaming temporary file failed’ ;
case ZipArchive :: ER_CLOSE : return ‘S Closing zip archive failed’ ;
case ZipArchive :: ER_SEEK : return ‘S Seek error’ ;
case ZipArchive :: ER_READ : return ‘S Read error’ ;
case ZipArchive :: ER_WRITE : return ‘S Write error’ ;
case ZipArchive :: ER_CRC : return ‘N CRC error’ ;
case ZipArchive :: ER_ZIPCLOSED : return ‘N Containing zip archive was closed’ ;
case ZipArchive :: ER_NOENT : return ‘N No such file’ ;
case ZipArchive :: ER_EXISTS : return ‘N File already exists’ ;
case ZipArchive :: ER_OPEN : return ‘S Can\’t open file’ ;
case ZipArchive :: ER_TMPOPEN : return ‘S Failure to create temporary file’ ;
case ZipArchive :: ER_ZLIB : return ‘Z Zlib error’ ;
case ZipArchive :: ER_MEMORY : return ‘N Malloc failure’ ;
case ZipArchive :: ER_CHANGED : return ‘N Entry has been changed’ ;
case ZipArchive :: ER_COMPNOTSUPP : return ‘N Compression method not supported’ ;
case ZipArchive :: ER_EOF : return ‘N Premature EOF’ ;
case ZipArchive :: ER_INVAL : return ‘N Invalid argument’ ;
case ZipArchive :: ER_NOZIP : return ‘N Not a zip archive’ ;
case ZipArchive :: ER_INTERNAL : return ‘N Internal error’ ;
case ZipArchive :: ER_INCONS : return ‘N Zip archive inconsistent’ ;
case ZipArchive :: ER_REMOVE : return ‘S Can\’t remove file’ ;
case ZipArchive :: ER_DELETED : return ‘N Entry has been deleted’ ;

default: return sprintf ( ‘Unknown status %s’ , $status );
>
>

A way of zipping files and downloading them thereafter:
= array( ‘image.jpeg’ , ‘text.txt’ , ‘music.wav’ );
$zipname = ‘enter_any_name_for_the_zipped_file.zip’ ;
$zip = new ZipArchive ;
$zip -> open ( $zipname , ZipArchive :: CREATE );
foreach ( $files as $file ) <
$zip -> addFile ( $file );
>
$zip -> close ();

///Then download the zipped file.
header ( ‘Content-Type: application/zip’ );
header ( ‘Content-disposition: attachment; filename=’ . $zipname );
header ( ‘Content-Length: ‘ . filesize ( $zipname ));
readfile ( $zipname );

Simple class xZip to zip big folders into multiple parts and unzip multi zip files at once.

class xZip <
public function __construct () <>
private function _rglobRead ( $source , & $array = array()) <
if (! $source || trim ( $source ) == «» ) <
$source = «.» ;
>
foreach ((array) glob ( $source . «/*/» ) as $key => $value ) <
$this -> _rglobRead ( str_replace ( «//» , «/» , $value ), $array );
>

foreach ((array) glob ( $source . «*.*» ) as $key => $value ) <
$array [] = str_replace ( «//» , «/» , $value );
>
>
private function _zip ( $array , $part , $destination ) <
$zip = new ZipArchive ;
@ mkdir ( $destination , 0777 , true );

if ( $zip -> open ( str_replace ( «//» , «/» , » < $destination >/partz < $part >.zip» ), ZipArchive :: CREATE )) <
foreach ((array) $array as $key => $value ) <
$zip -> addFile ( $value , str_replace (array( «../» , «./» ), NULL , $value ));
>
$zip -> close ();
>
>
public function zip ( $limit = 500 , $source = NULL , $destination = «./» ) <
if (! $destination || trim ( $destination ) == «» ) <
$destination = «./» ;
>

$this -> _rglobRead ( $source , $input );
$maxinput = count ( $input );
$splitinto = (( $maxinput / $limit ) > round ( $maxinput / $limit , 0 )) ? round ( $maxinput / $limit , 0 ) + 1 : round ( $maxinput / $limit , 0 );

for( $i = 0 ; $i $splitinto ; $i ++) <
$this -> _zip ( array_slice ( $input , ( $i * $limit ), $limit , true ), $i , $destination );
>

unset( $input );
return;
>
public function unzip ( $source , $destination ) <
@ mkdir ( $destination , 0777 , true );

foreach ((array) glob ( $source . «/*.zip» ) as $key => $value ) <
$zip = new ZipArchive ;
if ( $zip -> open ( str_replace ( «//» , «/» , $value )) === true ) <
$zip -> extractTo ( $destination );
$zip -> close ();
>
>
>

public function __destruct () <>
>

//$zip = new xZip;
//$zip->zip(500, «images/», «images_zip/»);
//$zip->unzip(«images_zip/», «images/»);
?>

There is a limit withing PHP 5.3.3 (which seems to have been addressed in later versions; 5.3.29 seems ok on a different server).

If you try to open a zip file with more than 65,535 files in it (in my case it had 237,942 files) then you cannot access the later files. The numFiles property only reports the first 65k files.

The following code can be used to get a list of all the file names in a zip file.

for( $i = 0 ; $i $za -> numFiles ; $i ++ ) <
$stat = $za -> statIndex ( $i );
print_r ( basename ( $stat [ ‘name’ ] ) . PHP_EOL );
>
?>

Here is a simple function which zips folders with all sub folders or only a simple file. the $data var can be a string or an array.

public function un_zip ( $data , $arcpf , $mode = ‘zip’ , $obj = » ) <
$absoluterpfad = ‘YOUR_BASE_PATH’ ;
$arcpf = $absoluterpfad . DS . $arcpf ;
if( is_object ( $obj )== false ) <
$archiv = new ZipArchive ();
$archiv -> open ( $arcpf , ZipArchive :: CREATE );
>else < $archiv =& $obj ;>
if( $mode == ‘zip’ ) <
if( is_array ( $data )== true ) <
foreach( $data as $dtmp ) <
$archiv =& un_zip ( $dtmp , $arcpf , ‘zip’ ,& $archiv );
>
>else <
if( is_dir ( $data )== true ) <
$archiv -> addEmptyDir ( str_replace ( $absoluterpfad . DS , » , $data ));
$files = scandir ( $data );
$bad = array( ‘.’ , ‘..’ );
$files = array_diff ( $files , $bad );
foreach( $files as $ftmp ) <
if( is_dir ( $data . DS . $ftmp )== true ) <
$archiv -> addEmptyDir ( str_replace ( $absoluterpfad . DS , » , $data . ‘/’ . $ftmp ));
$archiv =& un_zip ( $data . DS . $ftmp , $arcpf , ‘zip’ ,& $archiv );
>elseif( is_file ( $data . DS . $ftmp )== true ) <
$archiv -> addFile ( $data . DS . $ftmp , str_replace ( $absoluterpfad . DS , » , $data . ‘/’ . $ftmp ));
>
>
>elseif( is_file ( $data )== true ) < $archiv ->addFile ( $data , str_replace ( $absoluterpfad . DS , » , $data ));>
>
>
if( is_object ( $obj )== false ) < $archiv ->close ();>
else
if( $mode == ‘unzip’ ) < $archiv ->extractTo ( $data );>
>
?>

Hi there.
I just wrote a little function to zip a whole folder while maintaining the dir-structure. I hope it might help someone.

function folderToZip ( $folder , & $zipFile , $subfolder = null ) <
if ( $zipFile == null ) <
// no resource given, exit
return false ;
>
// we check if $folder has a slash at its end, if not, we append one
$folder .= end ( str_split ( $folder )) == «/» ? «» : «/» ;
$subfolder .= end ( str_split ( $subfolder )) == «/» ? «» : «/» ;
// we start by going through all files in $folder
$handle = opendir ( $folder );
while ( $f = readdir ( $handle )) <
if ( $f != «.» && $f != «..» ) <
if ( is_file ( $folder . $f )) <
// if we find a file, store it
// if we have a subfolder, store it there
if ( $subfolder != null )
$zipFile -> addFile ( $folder . $f , $subfolder . $f );
else
$zipFile -> addFile ( $folder . $f );
> elseif ( is_dir ( $folder . $f )) <
// if we find a folder, create a folder in the zip
$zipFile -> addEmptyDir ( $f );
// and call the function again
folderToZip ( $folder . $f , $zipFile , $f );
>
>
>
>
?>

Use it like this:
= new ZipArchive ();
$z -> open ( «test.zip» , ZIPARCHIVE :: CREATE );
folderToZip ( «storeThisFolder» , $z );
$z -> close ();
?>

Have a good day!

Read a file from an archive to a variable.
A warning is printed automatically in case of a CRC32 mismatch, which we capture, so we can print our own error message.

= new ZipArchive ();
if ( $zip -> open ( ‘archive.zip’ )) <
$fp = $zip -> getStream ( ‘myfile.txt’ ); //file inside archive
if(! $fp )
die( «Error: can’t get stream to zipped file» );
$stat = $zip -> statName ( ‘myfile.txt’ );

$buf = «» ; //file buffer
ob_start (); //to capture CRC error message
while (! feof ( $fp )) <
$buf .= fread ( $fp , 2048 ); //reading more than 2156 bytes seems to disable internal CRC32 verification (bug?)
>
$s = ob_get_contents ();
ob_end_clean ();
if( stripos ( $s , «CRC error» ) != FALSE ) <
echo ‘CRC32 mismatch, current ‘ ;
printf ( «%08X» , crc32 ( $buf )); //current CRC
echo ‘, expected ‘ ;
printf ( «%08X» , $stat [ ‘crc’ ]); //expected CRC
>

fclose ( $fp );
$zip -> close ();
//Done, unpacked file is stored in $buf
>
?>

To create a corrupt file, change a byte in a zip file using a hex editor.

3,6GB to be correct) of zip files, this class will generate corrupt files of the result is larger than 4 GB. Using tar.gz is a proper alternative.

Be wary that there are several algorithms to generate a zip file. I found that Office OpenXML files created with ZipArchive are not recognized by Excel 2007, for example.

You have to use a different class to zip in this case, such as PclZip.

You can check general purpose flag to test if the zip file is encrypted. Example function below.

/**
* Check if the file is encrypted
*
* Notice: if file doesn’t exists or cannot be opened, function
* also return false.
*
* @param string $pathToArchive
* @return boolean return true if file is encrypted
*/
function isEncryptedZip ( $pathToArchive ) <
$fp = @ fopen ( $pathToArchive , ‘r’ );
$encrypted = false ;
if ( $fp && fseek ( $fp , 6 ) == 0 ) <
$string = fread ( $fp , 2 );
if ( false !== $string ) <
$data = unpack ( «vgeneral» , $string );
$encrypted = $data [ ‘general’ ] & 0x01 ? true : false ;
>
fclose ( $fp );
>
return $encrypted ;
>

How to detect corrupt files with CRC mismatch:

Creating a corrupt archive for testing is simple — zip some files and change a byte with a hex editor in the resulting ZIP file. Now you can test the file with a ZIP application to learn which file inside the archive is corrupt.

ZipArchive seems unable to detect broken files. ZipArchive::CHECKCONS doesn’t help, only if it’s not a ZIP file at all. It happily decompressed corrupt files in my tests and the user downloading the data is not informed.

источник

Читайте также:  Установка задней регулируемой подвески

Добавить комментарий

Adblock
detector