- ZipArchive::getStream
- Parameters
- Return Values
- Examples
- See Also
- User Contributed Notes 2 notes
- How To Read Zip Files In PHP (Simple Examples)
- TLDR – QUICK SLIDES
- TABLE OF CONTENTS
- PHP READ ZIP FILE
- 1) READ FILE LIST OR INFORMATION
- 2) READ FILE IN ZIP ARCHIVE
- 3) LEGACY ZIP READ
- EXTRA) HOW TO UNZIP FILE
- DOWNLOAD & NOTES
- SUPPORT
- EXAMPLE CODE DOWNLOAD
- EXTRA BITS & LINKS
- SUMMARY & REFERENCES
- INFOGRAPHIC CHEAT SHEET
- THE END
- Leave a Comment Cancel Reply
- Search
- Breakthrough Javascript
- Socials
- About Me
- Examples
- User Contributed Notes 5 notes
ZipArchive::getStream
Get a file handler to the entry defined by its name. For now, it only supports read operations.
Parameters
The name of the entry to use.
Return Values
Returns a file pointer (resource) on success or false on failure.
Examples
Example #1 Get the entry contents with fread() and store it
$contents = » ;
$z = new ZipArchive ();
if ( $z -> open ( ‘test.zip’ )) $fp = $z -> getStream ( ‘test’ );
if(! $fp ) exit( «failed\n» );
?php
while (! feof ( $fp )) $contents .= fread ( $fp , 2 );
>
fclose ( $fp );
file_put_contents ( ‘t’ , $contents );
echo «done.\n» ;
>
?>
Example #2 Same as the previous example but with fopen() and the zip stream wrapper
$contents = » ;
$fp = fopen ( ‘zip://’ . dirname ( __FILE__ ) . ‘/test.zip#test’ , ‘r’ );
if (! $fp ) exit( «cannot open\n» );
>
while (! feof ( $fp )) $contents .= fread ( $fp , 2 );
>
echo » $contents \n» ;
fclose ( $fp );
echo «done.\n» ;
?>?php
Example #3 Stream wrapper and image, can be used with the xml function as well
$im = imagecreatefromgif ( ‘zip://’ . dirname ( __FILE__ ) . ‘/test_im.zip#pear_item.gif’ );
imagepng ( $im , ‘a.png’ );
?>?php
See Also
- ZipArchive::getStreamIndex() — Get a file handler to the entry defined by its index (read only)
- ZipArchive::getStreamName() — Get a file handler to the entry defined by its name (read only)
- Compression Streams
User Contributed Notes 2 notes
Here a way to handle specific files from a zip archive without full extract :
$zip_file = ‘/path/to/file.zip’ ; // I wan to get stream a CSV files
$zip = new ZipArchive ();
$zip -> open ( $zip_file );
for ( $i = 0 ; $i < $zip ->numFiles ; $i ++) < // Check file by file
$name = $zip -> getNameIndex ( $i ); // Retrieve entry name
$extension = pathinfo ( $name , PATHINFO_EXTENSION );
if ( $extension === ‘csv’ ) < // I want to handle csv files
$stream = $zip -> getStream ( $name ); // No stream index access before PHP 8.2
// Starting PHP 8.2 $zip->getStreamIndex() or $zip->getStreamName()
// Do stuff with $stream
// .
>
>
How To Read Zip Files In PHP (Simple Examples)
Welcome to a quick tutorial on how to read zip files in PHP. So the old zip functions are deprecated in PHP 8, how do we read files using Zip Archive then? This has caused some confusion, but it is actually very straightforward.
To read zip files in PHP, we can use statIndex() to get the file statistics, and getFromName() to directly read a file.
- $zip = new ZipArchive;
- $zip->open(«FILE.ZIP», ZipArchive::RDONLY);
- $entries = $zip->count();
- for ($i=0; $istatIndex($i); >
- $content = $zip->getFromName(«FILE-IN-ZIP.TXT»);
- $zip->close();
That should cover the basics, but if you need more concrete examples – Read on!
TLDR – QUICK SLIDES
TABLE OF CONTENTS
PHP READ ZIP FILE
All right, let us now get into the examples of how to read a zip file in PHP.
1) READ FILE LIST OR INFORMATION
open($file, ZipArchive::RDONLY) !== true) < exit("Failed to open $file"); >// (B) LOOP THROUGH EVERY FILE & FOLDER - DISPLAY INFORMATION $total = $zip->count(); for ($i=0; $istatIndex($i)); > // (C) CLOSE ZIP $zip->close();
This should be pretty self-explanatory, and how Zip Archive works is actually somewhat like an array – Each file or folder inside the zip archive will have an index number. To get a whole list of files/folders inside the archive, we can simply use a for loop to run through them and statIndex() to fetch the information.
2) READ FILE IN ZIP ARCHIVE
open($file, ZipArchive::RDONLY) !== true) < exit("Failed to open $file"); >// (B) DIRECTLY READ FILE USING INDEX $content = $zip->getFromIndex(0); echo "$content
"; // (C) OR USE GET FROM FILE NAME $content = $zip->getFromName("second.txt"); echo "$content
"; // (D) CLOSE ZIP $zip->close();
To read the contents of a file inside a zip archive, we can either use getFromIndex() or getFromName() . But there will be a problem dealing with large files in this one. While both functions accept a second parameter to restrict the number of bytes read, there is just no way to open it as a file stream – The best way to deal with large files is still to unzip it and use fgets() instead.
3) LEGACY ZIP READ
// (B) READ FILES while ($entry = zip_read($zip)) < // (B1) GET FILE NAME & SIZE $name = zip_entry_name($entry); $size = zip_entry_filesize($entry); echo "$name - $size bytes
"; // (B2) READ FILE DIRECTLY if ($name == "first.txt") < if (zip_entry_open($zip, $entry)) < $contents = zip_entry_read($entry); echo "$contents
"; zip_entry_close($entry); > else < echo "Cannot open first.txt"; >> > zip_close($zip);
Yes, the old zip functions are deprecated in PHP 8 (they still work but will eventually disappear). I shall not explain too much on this example but leave it here as “legacy support”… Do not use this method anymore, unless you have to support the older PHP versions.
EXTRA) HOW TO UNZIP FILE
open("TEST.ZIP") === TRUE) < $zip->extractTo("DESTINATION/FOLDER/"); $zip->close(); >
DOWNLOAD & NOTES
Here is the download link to the example code, so you don’t have to copy-paste everything.
SUPPORT
600+ free tutorials & projects on Code Boxx and still growing. I insist on not turning Code Boxx into a «paid scripts and courses» business, so every little bit of support helps.
EXAMPLE CODE DOWNLOAD
Click here for the source code on GitHub gist, just click on “download zip” or do a git clone. I have released it under the MIT license, so feel free to build on top of it or use it in your own project.
EXTRA BITS & LINKS
That’s all for the main tutorial, and here is a small section on some extras and links that may be useful to you.
SUMMARY & REFERENCES
INFOGRAPHIC CHEAT SHEET
THE END
Thank you for reading, and we have come to the end. I hope that it has helped you to better understand, and if you want to share anything with this guide, please feel free to comment below. Good luck and happy coding!
Leave a Comment Cancel Reply
Search
Breakthrough Javascript
Take pictures with the webcam, voice commands, video calls, GPS, NFC. Yes, all possible with Javascript — Check out Breakthrough Javascript!
Socials
About Me
W.S. Toh is a senior web developer and SEO practitioner with over 20 years of experience. Graduated from the University of London. When not secretly being an evil tech ninja, he enjoys photography and working on DIY projects.
Code Boxx participates in the eBay Partner Network, an affiliate program designed for sites to earn commission fees by linking to ebay.com. We also participate in affiliate programs with Bluehost, ShareASale, Clickbank, and other sites. We are compensated for referring traffic.
Examples
$zip -> addFromString ( «testfilephp.txt» . time (), «#1 This is a test string added as testfilephp.txt.\n» );
$zip -> addFromString ( «testfilephp2.txt» . time (), «#2 This is a test string added as testfilephp2.txt.\n» );
$zip -> addFile ( $thisdir . «/too.php» , «/testfromfile.php» );
echo «numfiles: » . $zip -> numFiles . «\n» ;
echo «status:» . $zip -> status . «\n» ;
$zip -> close ();
?>
Example #2 Dump the archive details and listing
$za -> open ( ‘test_with_comment.zip’ );
print_r ( $za );
var_dump ( $za );
echo «numFiles: » . $za -> numFiles . «\n» ;
echo «status: » . $za -> status . «\n» ;
echo «statusSys: » . $za -> statusSys . «\n» ;
echo «filename: » . $za -> filename . «\n» ;
echo «comment: » . $za -> comment . «\n» ;
for ( $i = 0 ; $i < $za ->numFiles ; $i ++) echo «index: $i \n» ;
print_r ( $za -> statIndex ( $i ));
>
echo «numFile:» . $za -> numFiles . «\n» ;
?>
Example #3 Zip stream wrapper, read an OpenOffice meta info
$reader -> open ( ‘zip://’ . dirname ( __FILE__ ) . ‘/test.odt#meta.xml’ );
$odt_meta = array();
while ( $reader -> read ()) if ( $reader -> nodeType == XMLREADER :: ELEMENT ) $elm = $reader -> name ;
> else if ( $reader -> nodeType == XMLREADER :: END_ELEMENT && $reader -> name == ‘office:meta’ ) break;
>
if (! trim ( $reader -> value )) continue;
>
$odt_meta [ $elm ] = $reader -> value ;
>
>
print_r ( $odt_meta );
?>
This example uses the old API (PHP 4), it opens a ZIP file archive, reads each file in the archive and prints out its contents. The test2.zip archive used in this example is one of the test archives in the ZZIPlib source distribution.
Example #4 Zip Usage Example
$zip = zip_open ( «/tmp/test2.zip» );
if ( $zip ) while ( $zip_entry = zip_read ( $zip )) echo «Name: » . zip_entry_name ( $zip_entry ) . «\n» ;
echo «Actual Filesize: » . zip_entry_filesize ( $zip_entry ) . «\n» ;
echo «Compressed Size: » . zip_entry_compressedsize ( $zip_entry ) . «\n» ;
echo «Compression Method: » . zip_entry_compressionmethod ( $zip_entry ) . «\n» ;
if ( zip_entry_open ( $zip , $zip_entry , «r» )) echo «File Contents:\n» ;
$buf = zip_entry_read ( $zip_entry , zip_entry_filesize ( $zip_entry ));
echo » $buf \n» ;
zip_entry_close ( $zip_entry );
>
echo «\n» ;
User Contributed Notes 5 notes
All these examples will not work if the php script has no write access within the folder.
Although you may say this is obvious, I found that in this case, $zip->open(«name», ZIPARCHIVE::CREATE) doesn’t return an error as it might not try to access the file system but rather allocates memory.
It is only $zip->close() that returns the error. This might cause you seeking at the wrong end.
you can use this code for reading JAR files (java archives)
JAR files use the same ZIP format, so can be easily read
$zf = zip_open(realpath(‘D:/lucene/allinone/lucene-core.jar’)); $i=1;
while($zf && $ze = zip_read($zf)) $zi[$i][‘zip entry name’]= zip_entry_name($ze);
$zi[$i][‘zip entry filesize’]= zip_entry_filesize($ze);
$zi[$i][‘zip entry compressed size’]= zip_entry_compressedsize($ze);
$zi[$i][‘zip entry compression method’]= zip_entry_compressionmethod($ze);
$zi[$i][‘zip entry open status’] = zip_entry_open($zf,$ze);
//$zi[$i][‘zip entry file contents’] = zip_entry_read($ze,100);
$i++;
>
print_r($zi);
zip_close($zf);
$zip = new ZipArchive ;
$zip -> open ( ‘teste.zip’ );
$zip -> extractTo ( ‘./’ );
$zip -> close ();
echo «Ok!» ;
?>?php>
1) If you want to add files to a ZIP archive but you don’t know if the ZiP file exists or not, you MUST check: this changes the way you open it !.
2) you can not append multiple flags, can use only one (or none).
If the zip does not exists, open it with:
$ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE)
(or a different compression method)
If the zip already exists, open it with:
$ziph->open($archiveFile)
or
$ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS)
Example: make backup files every hour and ZIP them all in a daily ZIP archive, so you want to get only one ZIP per day, each ZIP containing 24 files:
function archivebackup ( $archiveFile , $file , & $errMsg )
$ziph = new ZipArchive ();
if( file_exists ( $archiveFile ))
if( $ziph -> open ( $archiveFile , ZIPARCHIVE :: CHECKCONS ) !== TRUE )
$errMsg = «Unable to Open $archiveFile » ;
return 1 ;
>
>
else
if( $ziph -> open ( $archiveFile , ZIPARCHIVE :: CM_PKWARE_IMPLODE ) !== TRUE )
$errMsg = «Could not Create $archiveFile » ;
return 1 ;
>
>
if(! $ziph -> addFile ( $file ))
$errMsg = «error archiving $file in $archiveFile » ;
return 2 ;
>
$ziph -> close ();
If you find your zip file not being created make sure every file you are adding to the zip is valid. If even one file is not available when zip->close is called then the archive will fail and your zip file won’t be created.