/**
 * 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);
}
示例#2
0
/**
 * Gets zip file contents
 *
 * @param   string  $file
 * @return  array  ($error_message, $file_data); $error_message
 *                  is empty if no error
 * @author lem9
 */
function PMA_getZipContents($file)
{
    $error_message = '';
    $file_data = '';
    $zip_handle = zip_open($file);
    if (is_resource($zip_handle)) {
        $first_zip_entry = zip_read($zip_handle);
        if (false === $first_zip_entry) {
            $error_message = $GLOBALS['strNoFilesFoundInZip'];
        } else {
            /* 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)) {
                /* Return the correct contents, not just the first entry */
                for (;;) {
                    $entry = zip_read($zip_handle);
                    if (is_resource($entry)) {
                        if (!strcmp('content.xml', 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 'content.xml' or there was a parsing
                         * error that we must display
                         */
                        if ($entry === FALSE) {
                            $error_message = $GLOBALS['strErrorInZipFile'] . ' Could not find "content.xml"';
                        } else {
                            $error_message = $GLOBALS['strErrorInZipFile'] . ' ' . PMA_getZipError($zip_handle);
                        }
                        break;
                    }
                }
            } else {
                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);
            }
        }
    } else {
        $error_message = $GLOBALS['strErrorInZipFile'] . ' ' . PMA_getZipError($zip_handle);
    }
    zip_close($zip_handle);
    return array('error' => $error_message, 'data' => $file_data);
}
/**
 * Gets zip file contents
 *
 * @param   string  $file
 * @return  array  ($error_message, $file_data); $error_message
 *                  is empty if no error
 * @author lem9
 */
function PMA_getZipContents($file)
{
    $error_message = '';
    $file_data = '';
    $zip_handle = zip_open($file);
    if (is_resource($zip_handle)) {
        $first_zip_entry = zip_read($zip_handle);
        if (false === $first_zip_entry) {
            $error_message = $GLOBALS['strNoFilesFoundInZip'];
        } else {
            zip_entry_open($zip_handle, $first_zip_entry, 'r');
            $file_data = zip_entry_read($first_zip_entry, zip_entry_filesize($first_zip_entry));
            zip_entry_close($first_zip_entry);
        }
    } else {
        $error_message = $GLOBALS['strErrorInZipFile'] . ' ' . PMA_getZipError($zip_handle);
    }
    zip_close($zip_handle);
    return array('error' => $error_message, 'data' => $file_data);
}
 /**
  * Test for PMA_getZipError
  *
  * @param int   $code   error code
  * @param mixed $output expected output
  *
  * @dataProvider providerForTestGetZipError
  * @return void
  */
 public function testGetZipError($code, $output)
 {
     $this->assertEquals(PMA_getZipError($code), $output);
 }