2 /////////////////////////////////////////////////////////////////
3 /// getID3() by James Heinrich <info@getid3.org> //
4 // available at http://getid3.sourceforge.net //
5 // or http://www.getid3.org //
6 // also https://github.com/JamesHeinrich/getID3 //
7 /////////////////////////////////////////////////////////////////
9 // /demo/demo.zip.php - part of getID3() //
10 // Sample script how to use getID3() to decompress zip files //
11 // See readme.txt for more details //
13 /////////////////////////////////////////////////////////////////
16 function UnzipFileContents($filename, &$errors) {
18 $DecompressedFileContents = array();
19 if (!class_exists('getID3')) {
20 $errors[] = 'class getID3 not defined, please include getid3.php';
21 } elseif (include_once('module.archive.zip.php')) {
22 $getid3 = new getID3();
23 $getid3->info['filesize'] = filesize($filename);
25 if ($getid3->fp = fopen($filename, 'rb')) {
27 $getid3_zip = new getid3_zip($getid3);
28 $getid3_zip->analyze($filename);
29 if (($getid3->info['fileformat'] == 'zip') && !empty($getid3->info['zip']['files'])) {
30 if (!empty($getid3->info['zip']['central_directory'])) {
31 $ZipDirectoryToWalk = $getid3->info['zip']['central_directory'];
32 } elseif (!empty($getid3->info['zip']['entries'])) {
33 $ZipDirectoryToWalk = $getid3->info['zip']['entries'];
35 $errors[] = 'failed to parse ZIP attachment "'.$piece_filename.'" (no central directory)<br>';
39 foreach ($ZipDirectoryToWalk as $key => $valuearray) {
40 fseek($getid3->fp, $valuearray['entry_offset'], SEEK_SET);
41 $LocalFileHeader = $getid3_zip->ZIPparseLocalFileHeader($getid3->fp);
42 if ($LocalFileHeader['flags']['encrypted']) {
44 $DecompressedFileContents[$valuearray['filename']] = '';
46 fseek($getid3->fp, $LocalFileHeader['data_offset'], SEEK_SET);
47 $compressedFileData = '';
48 while ((strlen($compressedFileData) < $LocalFileHeader['compressed_size']) && !feof($getid3->fp)) {
49 $compressedFileData .= fread($getid3->fp, 32768);
51 switch ($LocalFileHeader['raw']['compression_method']) {
52 case 0: // store - great, just copy data unchanged
53 $uncompressedFileData = $compressedFileData;
58 $uncompressedFileData = gzinflate($compressedFileData);
59 $gzinflate_errors = trim(strip_tags(ob_get_contents()));
61 if ($gzinflate_errors) {
62 $errors[] = 'gzinflate() failed for file ['.$LocalFileHeader['filename'].']: "'.$gzinflate_errors.'"';
75 case 10: // PKWARE Date Compression Library Imploding
76 $DecompressedFileContents[$valuearray['filename']] = '';
77 $errors[] = 'unsupported ZIP compression method ('.$LocalFileHeader['raw']['compression_method'].' = '.$getid3_zip->ZIPcompressionMethodLookup($LocalFileHeader['raw']['compression_method']).')';
81 $DecompressedFileContents[$valuearray['filename']] = '';
82 $errors[] = 'unknown ZIP compression method ('.$LocalFileHeader['raw']['compression_method'].')';
85 $DecompressedFileContents[$valuearray['filename']] = $uncompressedFileData;
86 unset($compressedFileData);
90 $errors[] = $filename.' does not appear to be a zip file';
93 $error_message = ob_get_contents();
95 $errors[] = 'failed to fopen('.$filename.', rb): '.$error_message;
98 $errors[] = 'failed to include_once(module.archive.zip.php)';
100 return $DecompressedFileContents;