Zip a folder (include itself).
Usage:
HZip::zipDir('/path/to/sourceDir', '/path/to/out.zip');
<?php
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();
}
}
?>
PHP.mk документација
ZipArchive
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Патека
class.ziparchive.php
Локална патека за оваа страница.
Извор
php.net/manual/en
Оригиналниот HTML се реупотребува и локално се стилизира.
Режим
Прокси + превод во позадина
Кодовите, табелите и белешките остануваат читливи во истиот тек.
Референца
class.ziparchive.php
ZipArchive
Референца за `class.ziparchive.php` со подобрена типографија и навигација.
На ZipArchive class
(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)
Вовед
(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)
Синопсис на класата
/* Константи */
/* Својства */
/* Методи */
public addFile(
string
string
int
int
int
): bool
string
$filepath,string
$entryname = "",int
$start = 0,int
$length = ZipArchive::LENGTH_TO_END,int
$flags = ZipArchive::FL_OVERWRITE): bool
public replaceFile(
string
int
int
int
int
): bool
string
$filepath,int
$index,int
$start = 0,int
$length = ZipArchive::LENGTH_TO_END,int
$flags = 0): bool
public setEncryptionIndex(int
$index, int $method, Иницијализира контекст за инкрементално хеширање ?string $password = null): boolpublic setEncryptionName(string
}$name, int $method, Иницијализира контекст за инкрементално хеширање ?string $password = null): boolСвојства
- lastId
-
Архива на датотеки, компресирана со Zip.
- status
-
Индексна вредност на последно додадениот запис (датотека или директориум). Достапно од PHP 8.0.0 и PECL zip 1.18.0.
- statusSys
-
Статус на Zip архивата. Достапно за затворена архива, од PHP 8.0.0 и PECL zip 1.18.0.
- numFiles
-
Системски статус на Zip архивата. Достапно за затворена архива, од PHP 8.0.0 и PECL zip 1.18.0.
- filename
-
Број на датотеки во архивата
- comment
-
Име на датотека во датотечниот систем
Содржина
- ZipArchive::addEmptyDir Оваа екстензија ви овозможува транспарентно да читате или пишувате компресирани ZIP архиви и датотеките во нив.
- ZipArchive::addFile — Додај нов директориум
- ZipArchive::addFromString — Додава датотека во ZIP архива од дадениот пат
- ZipArchive::addGlob — Додај датотека во ZIP архива користејќи ја нејзината содржина
- ZipArchive::addPattern — Додај датотеки од директориум според glob шема
- ZipArchive::clearError — Додај датотеки од директориум според PCRE шема
- ZipArchive::close — Исчисти ја пораката за грешка во статусот, системските и/или ZIP пораките
- ZipArchive::count — Затвори ја активната архива (отворена или новосоздадена)
- ZipArchive::deleteIndex — Брои го бројот на датотеки во архивата
- ZipArchive::deleteName — Избриши запис во архивата користејќи го неговиот индекс
- ZipArchive::extractTo — Избриши запис во архивата користејќи го неговото име
- ZipArchive::getArchiveComment — Извлечи ја содржината на архивата
- ZipArchive::getArchiveFlag — Враќа коментар на Zip архивата
- ZipArchive::getCommentIndex — Враќа вредност на глобален флаг на Zip архива
- ZipArchive::getCommentName — Враќа коментар на запис користејќи го индексот на записот
- ZipArchive::getExternalAttributesIndex — Враќа коментар на запис користејќи го името на записот
- ZipArchive::getExternalAttributesName — Преземи ги надворешните атрибути на запис дефиниран со неговиот индекс
- ZipArchive::getFromIndex — Преземи ги надворешните атрибути на запис дефиниран со неговото име
- ZipArchive::getFromName — Враќа содржина на запис користејќи го неговиот индекс
- ZipArchive::getNameIndex — Враќа име на запис користејќи го неговиот индекс
- ZipArchive::getStatusString — Враќа порака за статус грешка, системски и/или zip пораки
- ZipArchive::getStream — Добијте рачка за датотека до записот дефиниран по неговото име (само за читање)
- ZipArchive::getStreamIndex — Добијте рачка за датотека до записот дефиниран по неговиот индекс (само за читање)
- ZipArchive::getStreamName — Добијте рачка за датотека до записот дефиниран по неговото име (само за читање)
- ZipArchive::isCompressionMethodSupported — Проверете дали метод на компресија е поддржан од libzip
- ZipArchive::isEncryptionMethodSupported — Проверете дали метод на шифрирање е поддржан од libzip
- ZipArchive::locateName — Враќа индекс на запис во архивата
- ZipArchive::open — Отворете ZIP датотека архива
- ZipArchive::registerCancelCallback — Регистрирајте повик за дозволување откажување за време на затворање на архивата.
- ZipArchive::registerProgressCallback — Регистрирајте повик за обезбедување ажурирања за време на затворање на архивата.
- ZipArchive::renameIndex — Преименувај запис дефиниран по неговиот индекс
- ZipArchive::renameName — Преименувај запис дефиниран по неговото име
- ZipArchive::replaceFile — Замени датотека во ZIP архива со дадена патека
- ZipArchive::setArchiveComment — Постави коментар на ZIP архива
- ZipArchive::setArchiveFlag — Постави глобално знаме на 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 — Врати ги сите промени направени на запис со даденото име
Белешки од корисници — Интерпретира стринг од XML во објект
Коментар за архивата ¶
пред 13 години
ohcc на 163 dot com ¶
пред 10 години
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
Examples
Warning: Unknown: Cannot destroy the zip context in Unknown on line 0
<?php
$za = 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
<?php
$za = 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.
<?php
$za = new ZipArchive;
$za->open('51-n.com.zip',ZipArchive::CREATE|ZipArchive::OVERWRITE);
$za->addFromString('wuxiancheng.cn.txt','yes');
$za->close();
?>
polygon dot co dot in на gmail точка com ¶
пред 2 години
A modern way to zip a folder recursivly is using the DirectoryIterator. I use this little class:
<?php
class MakeZip
{
private ZipArchive $zipArchive;
private int $startPathLength; // chars to remove from the start for the stored entity
public function __construct(
string $zipArchivename,
public readonly string $startPath,
public readonly mixed $convert_function,
)
{
$this->zipArchive = new \ZipArchive;
$this->zipArchive->open($zipArchivename, ZipArchive::CREATE);
$this->startPathLength = strlen($this-> startPath);
$this-> zipDir($startPath);
}
public function __destruct()
{
$this-> zipArchive-> close();
}
/**
* 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 function zipDir($folder)
{
echo $folder . '<br>' . PHP_EOL;
foreach (new \DirectoryIterator($folder) as $f) {
if ($f->isDot())
continue; //skip . ..
if ($f->isDir()) {
if( $f->getExtension() === 'git') continue; // skip .git folder
$this-> zipArchive-> addEmptyDir($f->getPathname());
$this-> zipDir($f->getPathname());
continue;
}
if ($f->isFile()) {
if ($f->getBasename() === basename(__FILE__)) continue; // skip self
if ($f->getExtension() === 'zip') continue; // skip ZIP files
$this-> zipArchive ->addFile( substr($f-> getPathname(), $this-> startPathLength) ); // remove './'
continue;
}
}
}
}
?>
Which can be used thusly:
<?php
$host = str_replace('.', '_', $_SERVER['HTTP_HOST']);
$date = date('Ymd-His');
$zip = new \MakeZip("./archiv-$host-$date.zip", './', $convert_function);
unset($zip);
?>
Add encryption or other features in the constructor.
umbalaconmeogia at NOSPAM dot gmail dot com ¶
12 години пред
Simple class xZip to zip big folders into multiple parts and unzip multi zip files at once.
<?php
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/");
?>
AshleyDambra at live dot com ¶
пред 11 години
A way of zipping files and downloading them thereafter:
<?php
$files = 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);
?>
ebestwebmaster at gmail dot com ¶
пред 14 години
The following code can be used to get a list of all the file names in a zip file.
<?php
$za = new ZipArchive();
$za->open('theZip.zip');
for( $i = 0; $i < $za->numFiles; $i++ ){
$stat = $za->statIndex( $i );
print_r( basename( $stat['name'] ) . PHP_EOL );
}
?>
Jerry dot Saravia at emc dot com ¶
пред 13 години
There is a usefull function to get the ZipArchive status as a human readable string :
<?php
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 );
}
}
?>
bruno dot vibert at bonobox dot fr ¶
пред 14 години
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...
<?php
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{return $archiv;}
if($mode=='unzip'){$archiv->extractTo($data);}
}
?>
webmaster at sebastiangrinke dot info ¶
пред 11 години
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.
nick at fullfatthings dot com ¶
пред 15 години
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.
<?php
$zip = 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.
hardcorevenom at gmx dot com ¶
пред 13 години
Hi there.
I just wrote a little function to zip a whole folder while maintaining the dir-structure. I hope it might help someone.
<?php
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:
<?php
$z = new ZipArchive();
$z->open("test.zip", ZIPARCHIVE::CREATE);
folderToZip("storeThisFolder", $z);
$z->close();
?>
Have a good day!
niklas dot schumi at NOSPAM dot googlemail dot com ¶
пред 13 години
Important: Due to the natural file size limit of 4GB (~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.
ohcc на 163 dot com ¶
пред 10 години
<?php
//use bzip2 + ZipArchive to reduce file size of your zip archives.
$zip = new ZipArchive;
$zip->open('i.zip',ZIPARCHIVE::CREATE|ZIPARCHIVE::OVERWRITE);
$file='wuxiancheng.cn.sql';
$bzFilename = $file.'.bz2';
$sql = file_get_contents($file);
$sql = bzcompress($sql,9);
$zip->addFromString($bzFilename,$sql);
$zip->setArchiveComment('zipped on '.date('Y-M-d'));
?>
panique at web dot de ¶
12 години пред
You can check general purpose flag to test if the zip file is encrypted. Example function below.
<?php
/**
* 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;
}
piotr dot stop dot spam at gmail dot com ¶
пред 15 години
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.