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($filename); 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 "' . $piece_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($getid3->fp); 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 // shrink case 2: // reduce-1 // reduce-1 case 3: // reduce-2 // reduce-2 case 4: // reduce-3 // reduce-3 case 5: // reduce-4 // reduce-4 case 6: // implode // implode case 7: // tokenize // tokenize case 9: // deflate64 // 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; }
public static function CreateDeepArray($array_path, $separator, $value) { // assigns $value to a nested array path: // $foo = getid3_lib::CreateDeepArray('/path/to/my', '/', 'file.txt') // is the same as: // $foo = array ('path'=>array('to'=>'array('my'=>array('file.txt')))); // or // $foo['path']['to']['my'] = 'file.txt'; while ($array_path[0] == $separator) { $array_path = substr($array_path, 1); } if (($pos = strpos($array_path, $separator)) !== false) { return array(substr($array_path, 0, $pos) => getid3_zip::CreateDeepArray(substr($array_path, $pos + 1), $separator, $value)); } return array($array_path => $value); }
function UnzipFileContents($filename, &$errors) { $errors = array(); $DecompressedFileContents = array(); if (include_once 'getid3.module.archive.zip.php') { ob_start(); if ($fp_ziptemp = fopen($filename, 'rb')) { ob_end_clean(); $ThisFileInfo['filesize'] = filesize($filename); $getid3_zip = new getid3_zip($fp_ziptemp, $ThisFileInfo); if ($ThisFileInfo['fileformat'] == 'zip' && !empty($ThisFileInfo['zip']['files'])) { if (!empty($ThisFileInfo['zip']['central_directory'])) { $ZipDirectoryToWalk = $ThisFileInfo['zip']['central_directory']; } elseif (!empty($ThisFileInfo['zip']['entries'])) { $ZipDirectoryToWalk = $ThisFileInfo['zip']['entries']; } else { $errors[] = 'failed to parse ZIP attachment "' . $piece_filename . '" (no central directory)<br>'; fclose($fp_ziptemp); return false; } foreach ($ZipDirectoryToWalk as $key => $valuearray) { fseek($fp_ziptemp, $valuearray['entry_offset'], SEEK_SET); $LocalFileHeader = $getid3_zip->ZIPparseLocalFileHeader($fp_ziptemp); if ($LocalFileHeader['flags']['encrypted']) { // password-protected $DecompressedFileContents[$valuearray['filename']] = ''; } else { fseek($fp_ziptemp, $LocalFileHeader['data_offset'], SEEK_SET); $compressedFileData = ''; while (strlen($compressedFileData) < $LocalFileHeader['compressed_size'] && !feof($fp_ziptemp)) { $compressedFileData .= fread($fp_ziptemp, 32768); } switch ($LocalFileHeader['raw']['compression_method']) { case 0: // store - great, do nothing at all $uncompressedFileData = $compressedFileData; break; case 8: ob_start(); $uncompressedFileData = gzinflate($compressedFileData); $gzinflate_errors = ob_get_contents(); ob_end_clean(); if ($gzinflate_errors) { $errors[] = 'gzinflate() failed: "' . trim($gzinflate_errors) . '"'; continue 2; } break; 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(getid3.module.archive.zip.php)'; } return $DecompressedFileContents; }