ZipArchive::open

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

ZipArchive::openОткрывает ZIP-архив

Описание

mixed ZipArchive::open ( string $filename [, int $flags ] )

Открывает новый ZIP-архив для чтения, записи или изменения.

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

filename

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

flags

Используемый режим открытия файлов.

  • ZIPARCHIVE::OVERWRITE

  • ZIPARCHIVE::CREATE

  • ZIPARCHIVE::EXCL

  • ZIPARCHIVE::CHECKCONS

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

Коды ошибок

Возвращает TRUE при успешном завершении или код ошибки.

  • ZIPARCHIVE::ER_EXISTS

    Файл уже существует.

  • ZIPARCHIVE::ER_INCONS

    Несовместимый ZIP-архив.

  • ZIPARCHIVE::ER_INVAL

    Недопустимый аргумент.

  • ZIPARCHIVE::ER_MEMORY

    Ошибка динамического выделения памяти.

  • ZIPARCHIVE::ER_NOENT

    Нет такого файла.

  • ZIPARCHIVE::ER_NOZIP

    Не является ZIP-архивом.

  • ZIPARCHIVE::ER_OPEN

    Невозможно открыть файл.

  • ZIPARCHIVE::ER_READ

    Ошибка чтения.

  • ZIPARCHIVE::ER_SEEK

    Ошибка поиска.

Примеры

Пример #1 Открытие и извлечение

<?php
$zip 
= new ZipArchive;
$res $zip->open('test.zip');
if (
$res === TRUE) {
    echo 
'ok';
    
$zip->extractTo('test');
    
$zip->close();
} else {
    echo 
'failed, code:' $res;
}
?>

Пример #2 Создание архива

<?php
$zip 
= new ZipArchive;
$res $zip->open('test.zip'ZipArchive::CREATE);
if (
$res === TRUE) {
    
$zip->addFromString('test.txt''file content goes here');
    
$zip->addFile('data.txt''entryname.txt');
    
$zip->close();
    echo 
'ok';
} else {
    echo 
'failed';
}
?>

Коментарии

If the directory you are writing or saving into does not have the correct permissions set, you won't get any error messages and it will look like everything worked fine... except it won't have changed!

Instead make sure you collect the return value of ZipArchive::close(). If it is false... it didn't work.
2007-07-02 08:07:38
http://php5.kiev.ua/manual/ru/ziparchive.open.html
Автор:
If you try this to open a file with creation in mind (= empty zip to fill with other files), this may not work :

$res = $zip->open($zip_file, ZipArchive::CREATE);

// you may get false

Try this instead, it should work :

$res = $zip->open($zip_file, ZIPARCHIVE::OVERWRITE);
2008-05-16 03:26:45
http://php5.kiev.ua/manual/ru/ziparchive.open.html
Автор:
The file name does not need to end in '.zip' if it is created using tempnam().  You just need to overwrite the file instead of trying to read it:

<?php
$file 
tempnam("tmp""zip");
   
$zip = new ZipArchive();

// Zip will open and overwrite the file, rather than try to read it.
$zip->open($fileZipArchive::OVERWRITE);

$zip->close();

// Stream the file to the client
header("Content-Type: application/zip");
header("Content-Length: " filesize($file));
header("Content-Disposition: attachment; filename=\"a_zip_file.zip\"");
readfile($file);

unlink($file);
?>
2008-07-23 10:14:22
http://php5.kiev.ua/manual/ru/ziparchive.open.html
<?php

/*
Hi!

I made a little script about checking content and "secure repacking"
*/

$somefile "zip.zip";
$someurl "/some/url"
$zip = new ZipArchive;
$open $zip->open($somefileZIPARCHIVE::CHECKCONS);
// If the archive is broken(or just another file renamed to *.zip) the function will return error on httpd under windows, so it's good to check if the archive is ok with ZIPARCHIVE::CHECKCONS
if ($open === TRUE) {
if(!
$zip->extractTo($someurl)) {
die (
"Error during extracting");
}
$zip->close();
}
$new_archive_name "new.zip";
$new_zip = new ZipArchive;
$new_open $new_zip->open($new_archive_nameZIPARCHIVE::CREATE);
if (
$new_open === TRUE) {
$dir opendir($someurl);
while (
$file readdir($dir)) {
 if (
$file == "." || $file == "..") { } else {
 
//We do not wanna this files in the new zip archive
 
if (!$new_zip->addFile($file)) {
     print 
$file."was not added!<br />";
   }
  }
 }
}
$new_zip->close();
?>
2008-08-01 16:25:57
http://php5.kiev.ua/manual/ru/ziparchive.open.html
if you are echoing out the output and confused about the number...maybe this will help.  i'm not totally sure it is accurate though.

ZIPARCHIVE::ER_EXISTS - 10
ZIPARCHIVE::ER_INCONS - 21
ZIPARCHIVE::ER_INVAL - 18
ZIPARCHIVE::ER_MEMORY - 14
ZIPARCHIVE::ER_NOENT - 9
ZIPARCHIVE::ER_NOZIP - 19
ZIPARCHIVE::ER_OPEN - 11
ZIPARCHIVE::ER_READ - 5
ZIPARCHIVE::ER_SEEK - 4
2008-12-04 13:09:37
http://php5.kiev.ua/manual/ru/ziparchive.open.html
With php 5.2.6, the following code created a new zip or replaced a existing zip.
Note that I am only using the ZIPARCHIVE::OVERWRITE flag.

<?php
    $zip 
= new ZipArchive();
   
$opened $zip->open$zipFileNameZIPARCHIVE::OVERWRITE );
    if( 
$opened !== true ){
        die(
"cannot open {$zipFileName} for writing.");
    }
   
$zip->addFromString$name$contents );
   
$zip->close();
?>

Now, with php 5.2.8, it does not work and gives this warning:

Warning: ZipArchive::addFromString() [ziparchive.addfromstring]: Invalid or unitialized Zip object in [myfile] on line [myline]

To fix this, you must specify the flags as create or overwrite.

<?php
    $zip 
= new ZipArchive();
   
$opened $zip->open$zipFileNameZIPARCHIVE::CREATE ZIPARCHIVE::OVERWRITE );
    if( 
$opened !== true ){
        die(
"cannot open {$zipFileName} for writing.");
    }
   
$zip->addFromString$name$contents );
   
$zip->close();
?>

When googling for the error message I found a lot of people that had it but couldn't figure out why they were getting it.
I hope this helps someone.
2009-02-06 09:06:21
http://php5.kiev.ua/manual/ru/ziparchive.open.html
to anyone getting an error ZIPARCHIVE::ER_READ = 5, when
doing $zip->open($zipfile) with a ZIP file containing a total of more then (around) 800 files (even when they are in sub-directories).

possibly related bugs 40873, 8714:

1. it was not an OS limit, because it worked when called from windows via samba on the same file at the same place

2. it wasn't working under 32bit linux

with php 5.3.0 the issue seems to be resolved.
2009-07-29 09:33:00
http://php5.kiev.ua/manual/ru/ziparchive.open.html
Further to what rickky at gmail dot com was saying, I've had that problem while trying to cache zip files and found that I had to set the permissions of the containing folder to 777 to get it to work.

Because this is a potential security weakness if on a public viewable folder, I'd recommend moving the folder so that it is no longer within public_html. You can then use readfile() to output the archive to the browser, with some HTTP headers to tell the browser it is a zip file.
2009-10-23 06:29:32
http://php5.kiev.ua/manual/ru/ziparchive.open.html
Автор:
As discussed in http://bugs.php.net/bug.php?id=54128 on Windows Server systems (2003, 2008) and IIS there is a problem when you want to unzip file stored in C:\Windows\Temp folder.
User of worker process IUSR_XXX has no directory listing right for C:\Windows\Temp and this is a reason why ZipArchive::open() fails with error 11 (error open). So it is not a good idea to store file for unzipping in folder defined by sys_get_temp_dir().
2011-03-10 02:04:28
http://php5.kiev.ua/manual/ru/ziparchive.open.html
Even though the api specifies that the flags are optional I found that I had to specify the flag ZIPARCHIVE::CREATE for an archive to be opened. 
This is on a Windows 7 system with PHP 5.3.0
2011-03-17 00:44:27
http://php5.kiev.ua/manual/ru/ziparchive.open.html
Most of the time people iterate over a directory with 'opendir' or 'readdir' to add files to a zip. Like...

while ($file = readdir($dir)) { ... $zip->addFile($file) }

Note that $zip->addFile($file) will only work in the current directory if your at the root. You will need to add the correct path to that $file string variable to have the full file name like ...

$zip->addFile($dir . DIRECTORY_SEPARATOR . $file); will work.

This may identify why you may get a read error when closing the file. 

Enjoy.
2011-08-30 13:06:21
http://php5.kiev.ua/manual/ru/ziparchive.open.html
If you have archives that you want to overwrite just use:

ZIPARCHIVE::CREATE

It will overwrite existing archives and at the same time create new ones if they don't already exist.

ZIPARCHIVE::OVERWRITE won't work for both of these scenarios.

(PHP version 5.4.4)
2012-11-17 22:53:33
http://php5.kiev.ua/manual/ru/ziparchive.open.html
Автор:
<?PHP
        $zip 
= new ZipArchive;
   
$res $zip->open('test.zip'ZipArchive::CREATE);

    if ( 
$res === TRUE) {
               
//CODE GOES HERE
       
       
$zip->close();
    } else {
        switch(
$res){
            case 
ZipArchive::ER_EXISTS
               
$ErrMsg "File already exists.";
                break;

            case 
ZipArchive::ER_INCONS
               
$ErrMsg "Zip archive inconsistent.";
                break;
               
            case 
ZipArchive::ER_MEMORY
               
$ErrMsg "Malloc failure.";
                break;
               
            case 
ZipArchive::ER_NOENT
               
$ErrMsg "No such file.";
                break;
               
            case 
ZipArchive::ER_NOZIP
               
$ErrMsg "Not a zip archive.";
                break;
               
            case 
ZipArchive::ER_OPEN
               
$ErrMsg "Can't open file.";
                break;
               
            case 
ZipArchive::ER_READ
               
$ErrMsg "Read error.";
                break;
               
            case 
ZipArchive::ER_SEEK
               
$ErrMsg "Seek error.";
                break;
           
            default: 
               
$ErrMsg "Unknow (Code $rOpen)";
                break;
               
           
        }
         die( 
'ZipArchive Error: ' $ErrMsg);
    }
?>
2014-01-29 23:53:23
http://php5.kiev.ua/manual/ru/ziparchive.open.html
Calling ZipArchive->open() will not create an empty zip archive file.
I found this out the hard way. I wrote code that produced positive
results: I.E. the return value from the call to ZipArchive was TRUE
and the empty zip file was not created. So at least call 
ZipArchive->addFromString(<filename.zip>, '<minimal content>')
when creating a new zip archive file.
2015-04-13 10:23:29
http://php5.kiev.ua/manual/ru/ziparchive.open.html
<?php
#made by abolfazl ziaratban (c)
#license GPL

class zip extends ZipArchive
   
{
        public function 
message($code)
            {
                switch (
$code)
                    {
                        case 
0:
                        return 
'No error';
                       
                        case 
1:
                        return 
'Multi-disk zip archives not supported';
                       
                        case 
2:
                        return 
'Renaming temporary file failed';
                       
                        case 
3:
                        return 
'Closing zip archive failed';
                       
                        case 
4:
                        return 
'Seek error';
                       
                        case 
5:
                        return 
'Read error';
                       
                        case 
6:
                        return 
'Write error';
                       
                        case 
7:
                        return 
'CRC error';
                       
                        case 
8:
                        return 
'Containing zip archive was closed';
                       
                        case 
9:
                        return 
'No such file';
                       
                        case 
10:
                        return 
'File already exists';
                       
                        case 
11:
                        return 
'Can\'t open file';
                       
                        case 
12:
                        return 
'Failure to create temporary file';
                       
                        case 
13:
                        return 
'Zlib error';
                       
                        case 
14:
                        return 
'Malloc failure';
                       
                        case 
15:
                        return 
'Entry has been changed';
                       
                        case 
16:
                        return 
'Compression method not supported';
                       
                        case 
17:
                        return 
'Premature EOF';
                       
                        case 
18:
                        return 
'Invalid argument';
                       
                        case 
19:
                        return 
'Not a zip archive';
                       
                        case 
20:
                        return 
'Internal error';
                       
                        case 
21:
                        return 
'Zip archive inconsistent';
                       
                        case 
22:
                        return 
'Can\'t remove file';
                       
                        case 
23:
                        return 
'Entry has been deleted';
                       
                        default:
                        return 
'An unknown error has occurred('.intval($code).')';
                    }               
            }

        public function 
isDir($path)
            {
                return 
substr($path,-1) == '/';
            }

        public function 
getTree()
            {
               
$Tree = array();
               
$pathArray = array();
                for(
$i=0$i<$this->numFiles$i++)
                    {
                       
$path $this->getNameIndex($i);
                       
$pathBySlash array_values(explode('/',$path));
                       
$c count($pathBySlash);
                       
$temp = &$Tree;
                        for(
$j=0$j<$c-1$j++)
                            if(isset(
$temp[$pathBySlash[$j]]))
                               
$temp = &$temp[$pathBySlash[$j]];
                            else
                                {
                                   
$temp[$pathBySlash[$j]] = array();
                                   
$temp = &$temp[$pathBySlash[$j]];
                                }
                        if(
$this->isDir($path))
                           
$temp[$pathBySlash[$c-1]] = array();
                        else
                           
$temp[] = $pathBySlash[$c-1];
                    }
                return 
$Tree;
            }
    }
?>
2015-05-24 19:35:47
http://php5.kiev.ua/manual/ru/ziparchive.open.html
<?php
   
// Use ZipArchive::OVERWRITE when the targetd file does not exist may lead you to an error like this
    // Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object 
    // try ZipArchive::OVERWRITE|ZipArchive::CREATE when you want to replace a zip archive that may not exist
   
$zip = new ZipArchive;
   
$rt=$zip->open('i.zip',ZipArchive::OVERWRITE);
    echo 
$rt;
   
// when i.zip does not exist, $rt is 9, ZipArchive::ER_NOENT, or "No such file."
   
$zip->addFile('wuxiancheng.cn.sql','db.sql');
   
// triggers an error with the message "Warning: ZipArchive::addFile(): Invalid or uninitialized Zip object ..."
   
   
    // Use ZipArchive::OVERWRITE|ZipArchive::CREATE
   
$zip = new ZipArchive;
   
$zip->open('i.zip',ZipArchive::OVERWRITE|ZipArchive::CREATE);   
   
$zip->addFile('wuxiancheng.cn.sql','db.sql');   
?>
2015-11-06 23:29:21
http://php5.kiev.ua/manual/ru/ziparchive.open.html
return values of ZipArchive::open() and their values and meanings
ZipArchive::ER_SEEK     4    Seek error.
ZipArchive::ER_READ     5    Read error.
ZipArchive::ER_NOENT     9    No such file.
ZipArchive::ER_OPEN     11    Can't open file.
ZipArchive::ER_EXISTS     10    File already exists.
ZipArchive::ER_MEMORY 14    Malloc failure.
ZipArchive::ER_INVAL     18    Invalid argument.
ZipArchive::ER_NOZIP     19    Not a zip archive.
ZipArchive::ER_INCONS     21    Zip archive inconsistent
2015-11-06 23:45:54
http://php5.kiev.ua/manual/ru/ziparchive.open.html
ZipArchive::OVERWRITE does NOT mean an existing file would be deleted when ZipArchive::open() is called.

In fact, the existing file will be deleted before PHP saves the zip archive on disk.

PHP takes these steps to finish zipping:

1. When ZipArchive::open('xx.zip') is called
If 'xx.zip' exists and is a zip archive, it will be opened and read as a temporary zip file, 
If the file does not exist, and ZipArchive::CREATE is applied, php will create a temporary empty zip file
In these cases, ZipArchive::open() returns true, otherwise it returns an integer error code.
2. Adds file(s) to the temporary zip file when methods such as addFile(), addFromString() are called.
3. Deletes the existing file before saving the temporary zip file on disk.
4. Save the temporary zip file on disk
5.  Closes the active archive when ZipArchive::close() is called or at the end of the script

Since PHP does NOT delete the existing file before saving the zip archive on disk, you should use unset() to delete it if you want to zip that file's containing folder and save the zip archive in that folder, otherwise you will get a larger and larger zip archive everytime you refresh the page.
2015-12-15 00:29:02
http://php5.kiev.ua/manual/ru/ziparchive.open.html
Автор:
Note that ZipArchive does not support generating streaming ZIP file content (i.e. start sending data to the user as soon as you start generating it such as from a database).  This means you have to write the entire file to disk first and then send the file to the user.  Doing that can take a while depending on how much data there is, which could run up against server timeout limits.

There are a couple of PHP userland libraries available on GitHub that can stream ZIP file content out to the user as soon as any data is written to the relevant classes.

cubiclesoft/php-zipstreamwriter
maennchen/ZipStream-PHP

Maybe a future version of ZipArchive will offer something similar.
2020-06-12 06:24:50
http://php5.kiev.ua/manual/ru/ziparchive.open.html
If on PHP 8.0+, you can use match expression to decode status code:

<?php
$archive 
= new \ZipArchive();
$result $archive->open('some.file.zip');

$message = match ($result) {
   
\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      => 'Malloc 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',
   
// \ZipArchive::ER_OK          => 'No error',
   
default                     => 'No error',
};
?>
2021-06-28 17:29:33
http://php5.kiev.ua/manual/ru/ziparchive.open.html
Автор:
To read a zip file contents then loop through $zip->numFiles using $zip->getNameIndex(i)

e.g.

            $zipfilename=$dir.DIRECTORY_SEPARATOR."test.zip";
            $zippedFile = new ZipArchive;
            $zippedFile->open($zipfilename);

            echo "<LI>".$zippedFile->getFromName("mpdf-8.0.7/.gitignore")."</LI><HR>";

            echo "<LI>Loaded $zipfilename ".$zippedFile->numFiles;
            for($i = 0; $i < $zippedFile->numFiles; $i++) {
                $fn=$zippedFile->getNameIndex($i);
                echo "<LI>$i: ".$fn;

                if ( strcmp(substr($fn, -1), DIRECTORY_SEPARATOR )==0 ) echo "... directory";
                else echo "... ".strlen($zippedFile->getFromIndex($i))." bytes";

            }
            $zippedFile->close();
2021-08-23 14:39:54
http://php5.kiev.ua/manual/ru/ziparchive.open.html

    Поддержать сайт на родительском проекте КГБ