123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- <?php
- /////////////////////////////////////////////////////////////////
- /// getID3() by James Heinrich <info@getid3.org> //
- // available at https://github.com/JamesHeinrich/getID3 //
- // or https://www.getid3.org //
- // or http://getid3.sourceforge.net //
- // //
- // /demo/demo.zip.php - part of getID3() //
- // Sample script how to use getID3() to decompress zip files //
- // see readme.txt for more details //
- // ///
- /////////////////////////////////////////////////////////////////
- die('For security reasons, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in demos/'.basename(__FILE__));
- function UnzipFileContents($filename, &$errors) {
- $errors = array();
- $DecompressedFileContents = array();
- if (!class_exists('getID3')) {
- $errors[] = 'class getID3 not defined, please include getid3.php';
- } elseif (include_once('module.archive.zip.php')) {
- $getid3 = new getID3();
- $getid3->info['filesize'] = filesize($filename);
- ob_start();
- if ($getid3->fp = fopen($filename, 'rb')) {
- ob_end_clean();
- $getid3_zip = new getid3_zip($getid3);
- $getid3_zip->analyze();
- if (($getid3->info['fileformat'] == 'zip') && !empty($getid3->info['zip']['files'])) {
- if (!empty($getid3->info['zip']['central_directory'])) {
- $ZipDirectoryToWalk = $getid3->info['zip']['central_directory'];
- } elseif (!empty($getid3->info['zip']['entries'])) {
- $ZipDirectoryToWalk = $getid3->info['zip']['entries'];
- } else {
- $errors[] = 'failed to parse ZIP attachment "'.$filename.'" (no central directory)<br>';
- fclose($getid3->fp);
- return false;
- }
- foreach ($ZipDirectoryToWalk as $key => $valuearray) {
- fseek($getid3->fp, $valuearray['entry_offset'], SEEK_SET);
- $LocalFileHeader = $getid3_zip->ZIPparseLocalFileHeader();
- if ($LocalFileHeader['flags']['encrypted']) {
- // password-protected
- $DecompressedFileContents[$valuearray['filename']] = '';
- } else {
- fseek($getid3->fp, $LocalFileHeader['data_offset'], SEEK_SET);
- $compressedFileData = '';
- while ((strlen($compressedFileData) < $LocalFileHeader['compressed_size']) && !feof($getid3->fp)) {
- $compressedFileData .= fread($getid3->fp, 32768);
- }
- switch ($LocalFileHeader['raw']['compression_method']) {
- case 0: // store - great, just copy data unchanged
- $uncompressedFileData = $compressedFileData;
- break;
- case 8: // deflate
- ob_start();
- $uncompressedFileData = gzinflate($compressedFileData);
- $gzinflate_errors = trim(strip_tags(ob_get_contents()));
- ob_end_clean();
- if ($gzinflate_errors) {
- $errors[] = 'gzinflate() failed for file ['.$LocalFileHeader['filename'].']: "'.$gzinflate_errors.'"';
- continue 2;
- }
- break;
- case 1: // shrink
- case 2: // reduce-1
- case 3: // reduce-2
- case 4: // reduce-3
- case 5: // reduce-4
- case 6: // implode
- case 7: // tokenize
- case 9: // deflate64
- case 10: // PKWARE Date Compression Library Imploding
- $DecompressedFileContents[$valuearray['filename']] = '';
- $errors[] = 'unsupported ZIP compression method ('.$LocalFileHeader['raw']['compression_method'].' = '.$getid3_zip->ZIPcompressionMethodLookup($LocalFileHeader['raw']['compression_method']).')';
- continue 2;
- default:
- $DecompressedFileContents[$valuearray['filename']] = '';
- $errors[] = 'unknown ZIP compression method ('.$LocalFileHeader['raw']['compression_method'].')';
- continue 2;
- }
- $DecompressedFileContents[$valuearray['filename']] = $uncompressedFileData;
- unset($compressedFileData);
- }
- }
- } else {
- $errors[] = $filename.' does not appear to be a zip file';
- }
- } else {
- $error_message = ob_get_contents();
- ob_end_clean();
- $errors[] = 'failed to fopen('.$filename.', rb): '.$error_message;
- }
- } else {
- $errors[] = 'failed to include_once(module.archive.zip.php)';
- }
- return $DecompressedFileContents;
- }
|