diff --git a/files/externallib.php b/files/externallib.php index 530f18d4c3205..2a94b7da6356e 100644 --- a/files/externallib.php +++ b/files/externallib.php @@ -1,375 +1,375 @@ -. - -/** - * External files API - * - * @package moodlecore - * @subpackage webservice - * @copyright 2010 Dongsheng Cai - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - -require_once("$CFG->libdir/externallib.php"); -require_once("$CFG->libdir/filelib.php"); - -/** - * Files functions - */ -class core_files_external extends external_api { - - /** - * Returns description of get_files parameters - * @return external_function_parameters - */ - public static function get_files_parameters() { - return new external_function_parameters( - array( - 'contextid' => new external_value(PARAM_INT, 'context id'), - 'component' => new external_value(PARAM_TEXT, 'component'), - 'filearea' => new external_value(PARAM_TEXT, 'file area'), - 'itemid' => new external_value(PARAM_INT, 'associated id'), - 'filepath' => new external_value(PARAM_PATH, 'file path'), - 'filename' => new external_value(PARAM_FILE, 'file name') - ) - ); - } - - /** - * Return moodle files listing - * @param int $contextid - * @param int $component - * @param int $filearea - * @param int $itemid - * @param string $filepath - * @param string $filename - * @return array - */ - public static function get_files($contextid, $component, $filearea, $itemid, $filepath, $filename) { - global $CFG, $USER, $OUTPUT; - $fileinfo = self::validate_parameters(self::get_files_parameters(), array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, 'filepath'=>$filepath, 'filename'=>$filename)); - - $browser = get_file_browser(); - - if (empty($fileinfo['contextid'])) { - $context = get_system_context(); - } else { - $context = get_context_instance_by_id($fileinfo['contextid']); - } - if (empty($fileinfo['component'])) { - $fileinfo['component'] = null; - } - if (empty($fileinfo['filearea'])) { - $fileinfo['filearea'] = null; - } - if (empty($fileinfo['itemid'])) { - $fileinfo['itemid'] = null; - } - if (empty($fileinfo['filename'])) { - $fileinfo['filename'] = null; - } - if (empty($fileinfo['filepath'])) { - $fileinfo['filepath'] = null; - } - - $return = array(); - $return['parents'] = array(); - $return['files'] = array(); - if ($file = $browser->get_file_info($context, $fileinfo['component'], $fileinfo['filearea'], $fileinfo['itemid'], $fileinfo['filepath'], $fileinfo['filename'])) { - $level = $file->get_parent(); - while ($level) { - $params = $level->get_params(); - $params['filename'] = $level->get_visible_name(); - array_unshift($return['parents'], $params); - $level = $level->get_parent(); - } - $list = array(); - $children = $file->get_children(); - foreach ($children as $child) { - - $params = $child->get_params(); - - if ($child->is_directory()) { - $node = array( - 'contextid' => $params['contextid'], - 'component' => $params['component'], - 'filearea' => $params['filearea'], - 'itemid' => $params['itemid'], - 'filepath' => $params['filepath'], - 'filename' => $child->get_visible_name(), - 'url' => null, - 'isdir' => true - ); - $list[] = $node; - } else { - $node = array( - 'contextid' => $params['contextid'], - 'component' => $params['component'], - 'filearea' => $params['filearea'], - 'itemid' => $params['itemid'], - 'filepath' => $params['filepath'], - 'filename' => $child->get_visible_name(), - 'url' => $child->get_url(), - 'isdir' => false - ); - $list[] = $node; - } - } - } - $return['files'] = $list; - return $return; - } - - /** - * Returns description of get_files returns - * @return external_multiple_structure - */ - public static function get_files_returns() { - return new external_single_structure( - array( - 'parents' => new external_multiple_structure( - new external_single_structure( - array( - 'contextid' => new external_value(PARAM_INT, ''), - 'component' => new external_value(PARAM_COMPONENT, ''), - 'filearea' => new external_value(PARAM_AREA, ''), - 'itemid' => new external_value(PARAM_INT, ''), - 'filepath' => new external_value(PARAM_TEXT, ''), - 'filename' => new external_value(PARAM_TEXT, ''), - ) - ) - ), - 'files' => new external_multiple_structure( - new external_single_structure( - array( - 'contextid' => new external_value(PARAM_INT, ''), - 'component' => new external_value(PARAM_COMPONENT, ''), - 'filearea' => new external_value(PARAM_AREA, ''), - 'itemid' => new external_value(PARAM_INT, ''), - 'filepath' => new external_value(PARAM_TEXT, ''), - 'filename' => new external_value(PARAM_FILE, ''), - 'isdir' => new external_value(PARAM_BOOL, ''), - 'url' => new external_value(PARAM_TEXT, ''), - ) - ) - ) - ) - ); - } - - /** - * Returns description of upload parameters - * @return external_function_parameters - */ - public static function upload_parameters() { - return new external_function_parameters( - array( - 'contextid' => new external_value(PARAM_INT, 'context id'), - 'component' => new external_value(PARAM_COMPONENT, 'component'), - 'filearea' => new external_value(PARAM_AREA, 'file area'), - 'itemid' => new external_value(PARAM_INT, 'associated id'), - 'filepath' => new external_value(PARAM_PATH, 'file path'), - 'filename' => new external_value(PARAM_FILE, 'file name'), - 'filecontent' => new external_value(PARAM_TEXT, 'file content') - ) - ); - } - - /** - * Uploading a file to moodle - * - * @param int $contextid - * @param string $component - * @param string $filearea - * @param int $itemid - * @param string $filepath - * @param string $filename - * @param string $filecontent - * @return array - */ - public static function upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent) { - global $USER, $CFG; - - $fileinfo = self::validate_parameters(self::upload_parameters(), array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, 'filepath'=>$filepath, 'filename'=>$filename, 'filecontent'=>$filecontent)); - - if (!isset($fileinfo['filecontent'])) { - throw new moodle_exception('nofile'); - } - // saving file - $dir = make_temp_directory('wsupload'); - - if (empty($fileinfo['filename'])) { - $filename = uniqid('wsupload', true).'_'.time().'.tmp'; - } else { - $filename = $fileinfo['filename']; - } - - if (file_exists($dir.$filename)) { - $savedfilepath = $dir.uniqid('m').$filename; - } else { - $savedfilepath = $dir.$filename; - } - - - file_put_contents($savedfilepath, base64_decode($fileinfo['filecontent'])); - unset($fileinfo['filecontent']); - - if (!empty($fileinfo['filepath'])) { - $filepath = $fileinfo['filepath']; - } else { - $filepath = '/'; - } - - if (isset($fileinfo['itemid'])) { - // TODO: in user private area, itemid is always 0 - $itemid = 0; - } else { - throw new coding_exception('itemid cannot be empty'); - } - - if (!empty($fileinfo['contextid'])) { - $context = get_context_instance_by_id($fileinfo['contextid']); - } else { - $context = get_system_context(); - } - - if (!($fileinfo['component'] == 'user' and $fileinfo['filearea'] == 'private')) { - throw new coding_exception('File can be uploaded to user private area only'); - } else { - // TODO: hard-coded to use user_private area - $component = 'user'; - $filearea = 'private'; - } - - $browser = get_file_browser(); - - // check existing file - if ($file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename)) { - throw new moodle_exception('fileexist'); - } - - // move file to filepool - if ($dir = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, '.')) { - $info = $dir->create_file_from_pathname($filename, $savedfilepath); - $params = $info->get_params(); - unlink($savedfilepath); - return array( - 'contextid'=>$params['contextid'], - 'component'=>$params['component'], - 'filearea'=>$params['filearea'], - 'itemid'=>$params['itemid'], - 'filepath'=>$params['filepath'], - 'filename'=>$params['filename'], - 'url'=>$info->get_url() - ); - } else { - throw new moodle_exception('nofile'); - } - } - - /** - * Returns description of upload returns - * @return external_multiple_structure - */ - public static function upload_returns() { - return new external_single_structure( - array( - 'contextid' => new external_value(PARAM_INT, ''), - 'component' => new external_value(PARAM_COMPONENT, ''), - 'filearea' => new external_value(PARAM_AREA, ''), - 'itemid' => new external_value(PARAM_INT, ''), - 'filepath' => new external_value(PARAM_TEXT, ''), - 'filename' => new external_value(PARAM_FILE, ''), - 'url' => new external_value(PARAM_TEXT, ''), - ) - ); - } -} - -/** - * Deprecated files functions - * @deprecated since Moodle 2.2 please use core_files_external instead - */ -class moodle_file_external extends external_api { - - /** - * Returns description of get_files parameters - * @deprecated since Moodle 2.2 please use core_files_external::get_files_parameters instead - * @return external_function_parameters - */ - public static function get_files_parameters() { - return core_files_external::get_files_parameters(); - } - - /** - * Return moodle files listing - * @deprecated since Moodle 2.2 please use core_files_external::get_files instead - * @param int $contextid - * @param int $component - * @param int $filearea - * @param int $itemid - * @param string $filepath - * @param string $filename - * @return array - */ - public static function get_files($contextid, $component, $filearea, $itemid, $filepath, $filename) { - return core_files_external::get_files($contextid, $component, $filearea, $itemid, $filepath, $filename); - } - - /** - * Returns description of get_files returns - * @deprecated since Moodle 2.2 please use core_files_external::get_files_returns instead - * @return external_multiple_structure - */ - public static function get_files_returns() { - return core_files_external::get_files_returns(); - } - - /** - * Returns description of upload parameters - * @deprecated since Moodle 2.2 please use core_files_external::upload_parameters instead - * @return external_function_parameters - */ - public static function upload_parameters() { - return core_files_external::upload_parameters(); - } - - /** - * Uploading a file to moodle - * @deprecated since Moodle 2.2 please use core_files_external::upload instead - * @param int $contextid - * @param string $component - * @param string $filearea - * @param int $itemid - * @param string $filepath - * @param string $filename - * @param string $filecontent - * @return array - */ - public static function upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent) { - return core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent); - } - - /** - * Returns description of upload returns - * @deprecated since Moodle 2.2 please use core_files_external::upload_returns instead - * @return external_multiple_structure - */ - public static function upload_returns() { - return core_files_external::upload_returns(); - } -} +. + +/** + * External files API + * + * @package moodlecore + * @subpackage webservice + * @copyright 2010 Dongsheng Cai + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once("$CFG->libdir/externallib.php"); +require_once("$CFG->libdir/filelib.php"); + +/** + * Files functions + */ +class core_files_external extends external_api { + + /** + * Returns description of get_files parameters + * @return external_function_parameters + */ + public static function get_files_parameters() { + return new external_function_parameters( + array( + 'contextid' => new external_value(PARAM_INT, 'context id'), + 'component' => new external_value(PARAM_TEXT, 'component'), + 'filearea' => new external_value(PARAM_TEXT, 'file area'), + 'itemid' => new external_value(PARAM_INT, 'associated id'), + 'filepath' => new external_value(PARAM_PATH, 'file path'), + 'filename' => new external_value(PARAM_FILE, 'file name') + ) + ); + } + + /** + * Return moodle files listing + * @param int $contextid + * @param int $component + * @param int $filearea + * @param int $itemid + * @param string $filepath + * @param string $filename + * @return array + */ + public static function get_files($contextid, $component, $filearea, $itemid, $filepath, $filename) { + global $CFG, $USER, $OUTPUT; + $fileinfo = self::validate_parameters(self::get_files_parameters(), array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, 'filepath'=>$filepath, 'filename'=>$filename)); + + $browser = get_file_browser(); + + if (empty($fileinfo['contextid'])) { + $context = get_system_context(); + } else { + $context = get_context_instance_by_id($fileinfo['contextid']); + } + if (empty($fileinfo['component'])) { + $fileinfo['component'] = null; + } + if (empty($fileinfo['filearea'])) { + $fileinfo['filearea'] = null; + } + if (empty($fileinfo['itemid'])) { + $fileinfo['itemid'] = null; + } + if (empty($fileinfo['filename'])) { + $fileinfo['filename'] = null; + } + if (empty($fileinfo['filepath'])) { + $fileinfo['filepath'] = null; + } + + $return = array(); + $return['parents'] = array(); + $return['files'] = array(); + if ($file = $browser->get_file_info($context, $fileinfo['component'], $fileinfo['filearea'], $fileinfo['itemid'], $fileinfo['filepath'], $fileinfo['filename'])) { + $level = $file->get_parent(); + while ($level) { + $params = $level->get_params(); + $params['filename'] = $level->get_visible_name(); + array_unshift($return['parents'], $params); + $level = $level->get_parent(); + } + $list = array(); + $children = $file->get_children(); + foreach ($children as $child) { + + $params = $child->get_params(); + + if ($child->is_directory()) { + $node = array( + 'contextid' => $params['contextid'], + 'component' => $params['component'], + 'filearea' => $params['filearea'], + 'itemid' => $params['itemid'], + 'filepath' => $params['filepath'], + 'filename' => $child->get_visible_name(), + 'url' => null, + 'isdir' => true + ); + $list[] = $node; + } else { + $node = array( + 'contextid' => $params['contextid'], + 'component' => $params['component'], + 'filearea' => $params['filearea'], + 'itemid' => $params['itemid'], + 'filepath' => $params['filepath'], + 'filename' => $child->get_visible_name(), + 'url' => $child->get_url(), + 'isdir' => false + ); + $list[] = $node; + } + } + } + $return['files'] = $list; + return $return; + } + + /** + * Returns description of get_files returns + * @return external_multiple_structure + */ + public static function get_files_returns() { + return new external_single_structure( + array( + 'parents' => new external_multiple_structure( + new external_single_structure( + array( + 'contextid' => new external_value(PARAM_INT, ''), + 'component' => new external_value(PARAM_COMPONENT, ''), + 'filearea' => new external_value(PARAM_AREA, ''), + 'itemid' => new external_value(PARAM_INT, ''), + 'filepath' => new external_value(PARAM_TEXT, ''), + 'filename' => new external_value(PARAM_TEXT, ''), + ) + ) + ), + 'files' => new external_multiple_structure( + new external_single_structure( + array( + 'contextid' => new external_value(PARAM_INT, ''), + 'component' => new external_value(PARAM_COMPONENT, ''), + 'filearea' => new external_value(PARAM_AREA, ''), + 'itemid' => new external_value(PARAM_INT, ''), + 'filepath' => new external_value(PARAM_TEXT, ''), + 'filename' => new external_value(PARAM_FILE, ''), + 'isdir' => new external_value(PARAM_BOOL, ''), + 'url' => new external_value(PARAM_TEXT, ''), + ) + ) + ) + ) + ); + } + + /** + * Returns description of upload parameters + * @return external_function_parameters + */ + public static function upload_parameters() { + return new external_function_parameters( + array( + 'contextid' => new external_value(PARAM_INT, 'context id'), + 'component' => new external_value(PARAM_COMPONENT, 'component'), + 'filearea' => new external_value(PARAM_AREA, 'file area'), + 'itemid' => new external_value(PARAM_INT, 'associated id'), + 'filepath' => new external_value(PARAM_PATH, 'file path'), + 'filename' => new external_value(PARAM_FILE, 'file name'), + 'filecontent' => new external_value(PARAM_TEXT, 'file content') + ) + ); + } + + /** + * Uploading a file to moodle + * + * @param int $contextid + * @param string $component + * @param string $filearea + * @param int $itemid + * @param string $filepath + * @param string $filename + * @param string $filecontent + * @return array + */ + public static function upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent) { + global $USER, $CFG; + + $fileinfo = self::validate_parameters(self::upload_parameters(), array('contextid'=>$contextid, 'component'=>$component, 'filearea'=>$filearea, 'itemid'=>$itemid, 'filepath'=>$filepath, 'filename'=>$filename, 'filecontent'=>$filecontent)); + + if (!isset($fileinfo['filecontent'])) { + throw new moodle_exception('nofile'); + } + // saving file + $dir = make_temp_directory('wsupload'); + + if (empty($fileinfo['filename'])) { + $filename = uniqid('wsupload', true).'_'.time().'.tmp'; + } else { + $filename = $fileinfo['filename']; + } + + if (file_exists($dir.$filename)) { + $savedfilepath = $dir.uniqid('m').$filename; + } else { + $savedfilepath = $dir.$filename; + } + + + file_put_contents($savedfilepath, base64_decode($fileinfo['filecontent'])); + unset($fileinfo['filecontent']); + + if (!empty($fileinfo['filepath'])) { + $filepath = $fileinfo['filepath']; + } else { + $filepath = '/'; + } + + if (isset($fileinfo['itemid'])) { + // TODO: in user private area, itemid is always 0 + $itemid = 0; + } else { + throw new coding_exception('itemid cannot be empty'); + } + + if (!empty($fileinfo['contextid'])) { + $context = get_context_instance_by_id($fileinfo['contextid']); + } else { + $context = get_system_context(); + } + + if (!($fileinfo['component'] == 'user' and $fileinfo['filearea'] == 'private')) { + throw new coding_exception('File can be uploaded to user private area only'); + } else { + // TODO: hard-coded to use user_private area + $component = 'user'; + $filearea = 'private'; + } + + $browser = get_file_browser(); + + // check existing file + if ($file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename)) { + throw new moodle_exception('fileexist'); + } + + // move file to filepool + if ($dir = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, '.')) { + $info = $dir->create_file_from_pathname($filename, $savedfilepath); + $params = $info->get_params(); + unlink($savedfilepath); + return array( + 'contextid'=>$params['contextid'], + 'component'=>$params['component'], + 'filearea'=>$params['filearea'], + 'itemid'=>$params['itemid'], + 'filepath'=>$params['filepath'], + 'filename'=>$params['filename'], + 'url'=>$info->get_url() + ); + } else { + throw new moodle_exception('nofile'); + } + } + + /** + * Returns description of upload returns + * @return external_multiple_structure + */ + public static function upload_returns() { + return new external_single_structure( + array( + 'contextid' => new external_value(PARAM_INT, ''), + 'component' => new external_value(PARAM_COMPONENT, ''), + 'filearea' => new external_value(PARAM_AREA, ''), + 'itemid' => new external_value(PARAM_INT, ''), + 'filepath' => new external_value(PARAM_TEXT, ''), + 'filename' => new external_value(PARAM_FILE, ''), + 'url' => new external_value(PARAM_TEXT, ''), + ) + ); + } +} + +/** + * Deprecated files functions + * @deprecated since Moodle 2.2 please use core_files_external instead + */ +class moodle_file_external extends external_api { + + /** + * Returns description of get_files parameters + * @deprecated since Moodle 2.2 please use core_files_external::get_files_parameters instead + * @return external_function_parameters + */ + public static function get_files_parameters() { + return core_files_external::get_files_parameters(); + } + + /** + * Return moodle files listing + * @deprecated since Moodle 2.2 please use core_files_external::get_files instead + * @param int $contextid + * @param int $component + * @param int $filearea + * @param int $itemid + * @param string $filepath + * @param string $filename + * @return array + */ + public static function get_files($contextid, $component, $filearea, $itemid, $filepath, $filename) { + return core_files_external::get_files($contextid, $component, $filearea, $itemid, $filepath, $filename); + } + + /** + * Returns description of get_files returns + * @deprecated since Moodle 2.2 please use core_files_external::get_files_returns instead + * @return external_multiple_structure + */ + public static function get_files_returns() { + return core_files_external::get_files_returns(); + } + + /** + * Returns description of upload parameters + * @deprecated since Moodle 2.2 please use core_files_external::upload_parameters instead + * @return external_function_parameters + */ + public static function upload_parameters() { + return core_files_external::upload_parameters(); + } + + /** + * Uploading a file to moodle + * @deprecated since Moodle 2.2 please use core_files_external::upload instead + * @param int $contextid + * @param string $component + * @param string $filearea + * @param int $itemid + * @param string $filepath + * @param string $filename + * @param string $filecontent + * @return array + */ + public static function upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent) { + return core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent); + } + + /** + * Returns description of upload returns + * @deprecated since Moodle 2.2 please use core_files_external::upload_returns instead + * @return external_multiple_structure + */ + public static function upload_returns() { + return core_files_external::upload_returns(); + } +}