PHP Doku:: Öffnet ein ZIP-Dateiarchiv - function.ziparchive-open.html

Verlauf / Chronik / History: (22) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzErweiterungen zur Datenkompression und ArchivierungZipThe ZipArchive classZipArchive::open

Ein Service von Reinhard Neidl - Webprogrammierung.

The ZipArchive class

<<ZipArchive::locateName

ZipArchive::renameIndex>>

ZipArchive::open

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

ZipArchive::openÖffnet ein ZIP-Dateiarchiv

Beschreibung

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

Öffnet ein neues ZIP-Archiv für Lese-, Schreib- und Veränderungszugriffe.

Parameter-Liste

filename

Der Name des zu öffnenden ZIP-Archivs.

flags

Der Modus, in dem das zu öffnende Archiv verwendet werden soll.

  • ZIPARCHIVE::OVERWRITE

  • ZIPARCHIVE::CREATE

  • ZIPARCHIVE::EXCL

  • ZIPARCHIVE::CHECKCONS

Rückgabewerte

Fehlercodes

Gibt TRUE oder den Fehlercode zurück.

  • ZIPARCHIVE::ER_EXISTS

  • ZIPARCHIVE::ER_INCONS

  • ZIPARCHIVE::ER_INVAL

  • ZIPARCHIVE::ER_MEMORY

  • ZIPARCHIVE::ER_NOENT

  • ZIPARCHIVE::ER_NOZIP

  • ZIPARCHIVE::ER_OPEN

  • ZIPARCHIVE::ER_READ

  • ZIPARCHIVE::ER_SEEK

Beispiele

Dieses Beispiel öffnet ein ZIP-Dateiarchiv, liest jede Datei im Archiv ein und gibt ihren Inhalt aus. Das test2.zip-Archiv, das in diesem Beispiel verwendet wird, ist eins der Testarchive der ZZIPlib-Quelldistribution.

Beispiel #1 Öffnen und extrahieren

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

Beispiel #2 Ein Archiv erstellen

<?php
$zip 
= new ZipArchive;
$res $zip->open('test.zip'ZipArchive::CREATE);
if (
$res === TRUE) {
    
$zip->addFromString('test.txt''Der Dateiinhalt kommt hier');
    
$zip->addFile('data.txt''eintragsname.txt');
    
$zip->close();
    echo 
'ok';
} else {
    echo 
'Fehler';
}
?>

9 BenutzerBeiträge:
- Beiträge aktualisieren...
sebwoolford at gmail dot com
23.10.2009 12:29
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.
michael202 at gmx dot de
29.07.2009 15:33
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.
eric at webdeveric dot com
6.02.2009 16:06
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.
jj at icglink dot com
4.12.2008 20:09
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
azsymvelik at gmail dot com
1.08.2008 22:25
<?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();
?>
Jonathan Baltazar
23.07.2008 16:14
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);
?>
olivier pons
16.05.2008 9:26
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);
Anonymous
19.12.2007 3:26
It seems the filename has to end in '.zip', so this suffix must be added when using tempnam() to create a random temporary file name.
rickky at gmail dot com
2.07.2007 14:07
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.



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)