1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
<?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);
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 $entry file in the archive that should be extracted
*
* @return string|bool data on sucess, false otherwise
*/
function PMA_zipExtract($zip_path, $entry)
{
$zip = new ZipArchive;
if ($zip->open($zip_path) === true) {
$result = $zip->getFromName($entry);
$zip->close();
return $result;
}
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;
}
|