I'm using CodeIgniter and I can't figure out how to unzip files!
Download the Unzip library
and include or autoload
the unzip
library
$this->load->library('unzip');
PHP itself has a number of functions for dealing with gzip files.
If you want to create a new, uncompressed file, it would be something like this.
Note: This doesn't check if the target file exists first, doesn't delete the input file, or do any error checking. You really should fix those before using this in production code.
// This input should be from somewhere else, hard-coded in this example
$file_name = 'file.txt.gz';
// Raising this value may increase performance
$buffer_size = 4096; // read 4kb at a time
$out_file_name = str_replace('.gz', '', $file_name);
// Open our files (in binary mode)
$file = gzopen($file_name, 'rb');
$out_file = fopen($out_file_name, 'wb');
// Keep repeating until the end of the input file
while(!gzeof($file)) {
// Read buffer-size bytes
// Both fwrite and gzread and binary-safe
fwrite($out_file, gzread($file, $buffer_size));
}
// Files are done, close files
fclose($out_file);
gzclose($file);
Note: This deals with gzip only. It doesn't deal with tar.
gzopen is way too much work. This is more intuitive:
$zipped = file_get_contents("foo.gz");
$unzipped = gzdecode($zipped);
works on http pages when the server is spitting out gzipped data also.
gzopen
and using a buffer is the proper way to do this. –
Mandate If you have access to system():
system("gunzip file.sql.gz");
Use the functions implemented by the Zlib Compression extension.
This snippet shows how to use some of the functions made available from the extension:
// open file for reading
$zp = gzopen($filename, "r");
// read 3 char
echo gzread($zp, 3);
// output until end of the file and close it.
gzpassthru($zp);
gzclose($zp);
Download the Unzip library
and include or autoload
the unzip
library
$this->load->library('unzip');
Complementing @Danial's answer...
$zipped = file_get_contents("foo.xlsx.gz");
$unzipped = gzdecode($zipped);
file_put_contents("foo.xlsx", $unzipped);
I agree, to use it on files with a few tens of MB is ok, I imagine this is the most frequent use, but when we reach hundreds of MB it is better to use a solution with gzopen()
and gzread()
.
Furthermore, it is possible to have the 2 solutions together 🚀 just check the size of the gz file. If it is smaller than 70MB, for example, use file_get_contents()
, if it is larger, use gzopen()
.
if (filesize("foo.xlsx.gz") <= (1024*1024*70)) {
// file_get_contents() approach...
} else {
// gzopen() approach...
}
Yes, I know that what matters most is the actual size of the decompressed file, but we can get a good idea since generally the compressed file is 30% smaller than the original file.
One line tip... to compress a file:
file_put_contents('output.gz', gzencode( file_get_contents('input.file'), 9));
© 2022 - 2024 — McMap. All rights reserved.