123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- <?php
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * Interface for the zip extension
- *
- * @package PhpMyAdmin
- */
- if (! defined('PHPMYADMIN')) {
- exit;
- }
- /**
- * Gets zip file contents
- *
- * @param string $file zip file
- * @param string $specific_entry regular expression to match a file
- *
- * @return array ($error_message, $file_data); $error_message
- * is empty if no error
- */
- function PMA_getZipContents($file, $specific_entry = null)
- {
- $error_message = '';
- $file_data = '';
- $zip_handle = zip_open($file);
- if (!is_resource($zip_handle)) {
- $error_message = __('Error in ZIP archive:')
- . ' ' . PMA_getZipError($zip_handle);
- zip_close($zip_handle);
- return (array('error' => $error_message, 'data' => $file_data));
- }
- $first_zip_entry = zip_read($zip_handle);
- if (false === $first_zip_entry) {
- $error_message = __('No files found inside ZIP archive!');
- zip_close($zip_handle);
- return (array('error' => $error_message, 'data' => $file_data));
- }
- /* Is the the zip really an ODS file? */
- $read = zip_entry_read($first_zip_entry);
- $ods_mime = 'application/vnd.oasis.opendocument.spreadsheet';
- if (!strcmp($ods_mime, $read)) {
- $specific_entry = '/^content\.xml$/';
- }
- if (!isset($specific_entry)) {
- zip_entry_open($zip_handle, $first_zip_entry, 'r');
- /* File pointer has already been moved,
- * so include what was read above */
- $file_data = $read;
- $file_data .= zip_entry_read(
- $first_zip_entry,
- zip_entry_filesize($first_zip_entry)
- );
- zip_entry_close($first_zip_entry);
- zip_close($zip_handle);
- return (array('error' => $error_message, 'data' => $file_data));
- }
- /* Return the correct contents, not just the first entry */
- for ( ; ; ) {
- $entry = zip_read($zip_handle);
- if (is_resource($entry)) {
- if (preg_match($specific_entry, zip_entry_name($entry))) {
- zip_entry_open($zip_handle, $entry, 'r');
- $file_data = zip_entry_read(
- $entry,
- zip_entry_filesize($entry)
- );
- zip_entry_close($entry);
- break;
- }
- } else {
- /**
- * Either we have reached the end of the zip and still
- * haven't found $specific_entry or there was a parsing
- * error that we must display
- */
- if ($entry === false) {
- $error_message = __('Error in ZIP archive:')
- . ' Could not find "' . $specific_entry . '"';
- } else {
- $error_message = __('Error in ZIP archive:')
- . ' ' . PMA_getZipError($zip_handle);
- }
- break;
- }
- }
- zip_close($zip_handle);
- return (array('error' => $error_message, 'data' => $file_data));
- }
- /**
- * Returns the file name of the first file that matches the given $file_regexp.
- *
- * @param string $file_regexp regular expression for the file name to match
- * @param string $file zip archive
- *
- * @return string the file name of the first file that matches the given regexp
- */
- function PMA_findFileFromZipArchive ($file_regexp, $file)
- {
- $zip_handle = zip_open($file);
- if (is_resource($zip_handle)) {
- $entry = zip_read($zip_handle);
- while (is_resource($entry)) {
- if (preg_match($file_regexp, zip_entry_name($entry))) {
- $file_name = zip_entry_name($entry);
- zip_close($zip_handle);
- return $file_name;
- }
- $entry = zip_read($zip_handle);
- }
- }
- zip_close($zip_handle);
- return false;
- }
- /**
- * Returns the number of files in the zip archive.
- *
- * @param string $file zip archive
- *
- * @return int the number of files in the zip archive
- */
- function PMA_getNoOfFilesInZip($file)
- {
- $count = 0;
- $zip_handle = zip_open($file);
- if (is_resource($zip_handle)) {
- $entry = zip_read($zip_handle);
- while (is_resource($entry)) {
- $count++;
- $entry = zip_read($zip_handle);
- }
- }
- zip_close($zip_handle);
- return $count;
- }
- /**
- * Extracts a set of files from the given zip archive to a given destinations.
- *
- * @param string $zip_path path to the zip archive
- * @param string $destination destination to extract files
- * @param array $entries files in archive that should be extracted
- *
- * @return bool true on sucess, false otherwise
- */
- function PMA_zipExtract($zip_path, $destination, $entries)
- {
- $zip = new ZipArchive;
- if ($zip->open($zip_path) === true) {
- $zip->extractTo($destination, $entries);
- $zip->close();
- return true;
- }
- return false;
- }
- /**
- * Gets zip error message
- *
- * @param resource $code error code
- *
- * @return string error message
- */
- function PMA_getZipError($code)
- {
- // I don't think this needs translation
- switch ($code) {
- case ZIPARCHIVE::ER_MULTIDISK:
- $message = 'Multi-disk zip archives not supported';
- break;
- case ZIPARCHIVE::ER_READ:
- $message = 'Read error';
- break;
- case ZIPARCHIVE::ER_CRC:
- $message = 'CRC error';
- break;
- case ZIPARCHIVE::ER_NOZIP:
- $message = 'Not a zip archive';
- break;
- case ZIPARCHIVE::ER_INCONS:
- $message = 'Zip archive inconsistent';
- break;
- default:
- $message = $code;
- }
- return $message;
- }
- ?>
|