International PHP Conference 2015

ZipArchive::open

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

ZipArchive::openOuvre une archive ZIP

Description

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

Ouvre une nouvelle archive ZIP pour lecture, écriture et modification.

Liste de paramètres

filename

Le nom du fichier ZIP à ouvrir.

flags

Le mode à utiliser pour ouvrir l'archive.

  • ZipArchive::OVERWRITE

  • ZipArchive::CREATE

  • ZipArchive::EXCL

  • ZipArchive::CHECKCONS

Valeurs de retour

Error codes

Retourne TRUE en cas de succès ou sinon, le code erreur

  • ZipArchive::ER_EXISTS

    Le fichier existe déjà.

  • ZipArchive::ER_INCONS

    L'archive ZIP est inconsistante.

  • ZipArchive::ER_INVAL

    Argument invalide.

  • ZipArchive::ER_MEMORY

    Erreur de mémoire.

  • ZipArchive::ER_NOENT

    Le fichier n'existe pas.

  • ZipArchive::ER_NOZIP

    N'est pas une archive ZIP.

  • ZipArchive::ER_OPEN

    Impossible d'ouvrir le fichier.

  • ZipArchive::ER_READ

    Erreur lors de la lecture.

  • ZipArchive::ER_SEEK

    Erreur de position.

Exemples

Exemple #1 Ouverture et extraction

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

Exemple #2 Création d'une archive

<?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''nom_de_l_entree.txt');
    
$zip->close();
    echo 
'ok';
} else {
    echo 
'échec';
}
?>
add a note add a note

User Contributed Notes 15 notes

up
17
jj at icglink dot com
6 years ago
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
up
10
eric at webdeveric dot com
6 years ago
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( $zipFileName, ZIPARCHIVE::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( $zipFileName, ZIPARCHIVE::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.
up
14
walter at clevertechie dot com
2 years ago
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)
up
4
Eric Langlois
1 year ago
<?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);
    }
?>
up
2
Jan Vavra
4 years ago
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().
up
1
sunil dt bhave at gmail dt com
4 years ago
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
up
1
azsymvelik at gmail dot com
7 years ago
<?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($somefile, ZIPARCHIVE::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_name, ZIPARCHIVE::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();
?>
up
1
Jonathan Baltazar
7 years ago
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($file, ZipArchive::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);
?>
up
1
rickky at gmail dot com
8 years ago
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.
up
2
sebwoolford at gmail dot com
5 years ago
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.
up
0
abolfazl dot ziaratban at gmail dot com
3 months ago
<?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;
            }
    }
?>
up
1
michael202 at gmx dot de
6 years ago
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.
up
-1
jekillen at prodigy net
4 months ago
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.
up
-1
YiiWanAB at hotmail dot com
4 years ago
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.
up
-6
olivier pons
7 years ago
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);
To Top