From 249c4f606ddb4d7c221c839dfd946400b10fbce3 Mon Sep 17 00:00:00 2001 From: Dongsheng Cai Date: Tue, 16 Mar 2010 08:29:08 +0000 Subject: [PATCH] "MDL-20904, web services for files" --- files/externallib.php | 289 ++++++++++++++++++++++++++++++++++++++++++ lib/db/services.php | 14 ++ 2 files changed, 303 insertions(+) create mode 100755 files/externallib.php diff --git a/files/externallib.php b/files/externallib.php new file mode 100755 index 00000000000..c352f40da5c --- /dev/null +++ b/files/externallib.php @@ -0,0 +1,289 @@ +. + +/** + * 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"); + +class moodle_file_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( + 'params' => new external_single_structure(array( + 'contextid' => new external_value(PARAM_INT, 'context id'), + 'itemid' => new external_value(PARAM_INT, 'associated id'), + 'filearea' => new external_value(PARAM_TEXT, 'file area'), + 'filepath' => new external_value(PARAM_RAW, 'file path'), + 'filename' => new external_value(PARAM_TEXT, 'file name'), + ) + ) + ) + ); + } + + /** + * Return moodle files listing + * @param array $fileinfo + * @return array + */ + public static function get_files($fileinfo) { + global $CFG, $USER, $OUTPUT; + if (empty($fileinfo['itemid'])) { + $fileinfo['itemid'] = null; + } + if (empty($fileinfo['filename'])) { + $fileinfo['filename'] = null; + } + if (empty($fileinfo['filepath'])) { + $fileinfo['filepath'] = null; + } + if (empty($fileinfo['filearea'])) { + $fileinfo['filearea'] = null; + } + if (empty($fileinfo['contextid'])) { + $context = get_system_context(); + } else { + $context = get_context_instance_by_id($fileinfo['contextid']); + } + try { + $browser = get_file_browser(); + + $return = array(); + $return['parents'] = array(); + $return['files'] = array(); + $file = $browser->get_file_info($context, null, null, null, null); + if ($file = $browser->get_file_info($context, $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( + 'filename' => $child->get_visible_name(), + 'filepath' => $params['filepath'], + 'filearea' => $params['filearea'], + 'itemid' => $params['itemid'], + 'contextid' => $params['contextid'], + 'url' => null, + 'isdir'=>true + ); + $list[] = $node; + } else { + $node = array( + 'filename' => $child->get_visible_name(), + 'filepath' => $params['filepath'], + 'filearea' => $params['filearea'], + 'itemid' => $params['itemid'], + 'contextid' => $params['contextid'], + 'url' => $child->get_url(), + 'isdir'=>false + ); + $list[] = $node; + } + } + } + $return['files'] = $list; + } catch (Exception $e) { + throw $e; + } + 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, ''), + 'filename' => new external_value(PARAM_TEXT, ''), + 'filearea' => new external_value(PARAM_TEXT, ''), + 'filepath' => new external_value(PARAM_TEXT, ''), + 'itemid' => new external_value(PARAM_INT, '') + ) + ) + ), + 'files' => new external_multiple_structure( + new external_single_structure( + array( + 'filename' => new external_value(PARAM_TEXT, ''), + 'filearea' => new external_value(PARAM_TEXT, ''), + 'filepath' => new external_value(PARAM_TEXT, ''), + 'itemid' => new external_value(PARAM_INT, ''), + 'isdir' => new external_value(PARAM_BOOL, ''), + 'url' => new external_value(PARAM_TEXT, ''), + 'contextid' => new external_value(PARAM_INT, '') + ) + ) + ) + ) + ); + } + + /** + * Returns description of upload parameters + * @return external_function_parameters + */ + public static function upload_parameters() { + return new external_function_parameters( + array( + 'params' => new external_single_structure(array( + 'contextid' => new external_value(PARAM_INT, 'context id'), + 'itemid' => new external_value(PARAM_INT, 'associated id'), + 'filearea' => new external_value(PARAM_TEXT, 'file area'), + 'filepath' => new external_value(PARAM_RAW, 'file path'), + 'filename' => new external_value(PARAM_TEXT, 'file name'), + 'filecontent' => new external_value(PARAM_TEXT, 'file content') + ) + ) + ) + ); + } + + /** + * Uploading a file to moodle + * + * @param array $fileinfo + * @return array + */ + public static function upload($fileinfo) { + global $USER, $CFG; + debug('testing'); + + if (!isset($fileinfo['filecontent'])) { + throw new moodle_exception('nofile'); + } + // saving file + if (!file_exists($CFG->dataroot.'/temp/wsupload')) { + mkdir($CFG->dataroot.'/temp/wsupload/', 0777, true); + } + + if (is_dir($CFG->dataroot.'/temp/wsupload')) { + $dir = $CFG->dataroot.'/temp/wsupload/'; + } + + if (empty($fileinfo['filename'])) { + $filename = uniqid('wsupload').'_'.time().'.tmp'; + } else { + $filename = $fileinfo['filename']; + } + + if (file_exists($dir.$filename)) { + $filename = uniqid('m').$filename; + } + + $savedfilepath = $dir.$filename; + + file_put_contents($savedfilepath, base64_decode($fileinfo['filecontent'])); + unset($fileinfo['filecontent']); + + if (!empty($fileinfo['filearea'])) { + $filearea = $fileinfo['filearea']; + } else { + $filearea = null; + } + + if (!empty($fileinfo['filepath'])) { + $filepath = $fileinfo['filepath']; + } else { + $filepath = ''; + } + + if (isset($fileinfo['itemid'])) { + $itemid = $fileinfo['itemid']; + } else { + $itemid = (int)substr(hexdec(uniqid()), 0, 9)+rand(1,100); + } + if (!empty($fileinfo['contextid'])) { + $context = get_context_instance_by_id($fileinfo['contextid']); + } else { + $context = get_system_context(); + } + + $fs = get_file_storage(); + $browser = get_file_browser(); + + // check existing file + if ($file = $fs->get_file($context->id, $filearea, $itemid, $filepath, $filename)) { + throw new moodle_exception('fileexist'); + } + + $file_record = new object(); + $file_record->contextid = $context->id; + $file_record->filearea = $filearea; + $file_record->itemid = $itemid; + $file_record->filepath = $filepath; + $file_record->filename = $filename; + $file_record->userid = $USER->id; + + // move file to filepool + try { + $file = $fs->create_file_from_pathname($file_record, $savedfilepath); + unlink($savedfilepath); + } catch (Exception $ex) { + throw $ex; + } + $info = $browser->get_file_info($context, $file->get_filearea(), $file->get_itemid(), $file->get_filepath(), $file->get_filename()); + + return array( + 'filename'=>$file->get_filename(), + 'filepath'=>$file->get_filepath(), + 'filearea'=>$file->get_filearea(), + 'url'=>$info->get_url() + ); + } + + /** + * Returns description of upload returns + * @return external_multiple_structure + */ + public static function upload_returns() { + return new external_single_structure( + array( + 'filename' => new external_value(PARAM_TEXT, ''), + 'filepath' => new external_value(PARAM_TEXT, ''), + 'filearea' => new external_value(PARAM_TEXT, ''), + 'url' => new external_value(PARAM_TEXT, ''), + ) + ); + } + +} diff --git a/lib/db/services.php b/lib/db/services.php index 02663bf6a56..24673f29ea9 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -83,6 +83,20 @@ $functions = array( 'description' => 'Deletes group members.', 'type' => 'delete', ), + 'moodle_file_get_files' => array( + 'classname' => 'moodle_file_external', + 'methodname' => 'get_files', + 'description' => 'browse moodle files', + 'type' => 'read', + 'classpath' => 'files/externallib.php', + ), + 'moodle_file_upload' => array( + 'classname' => 'moodle_file_external', + 'methodname' => 'upload', + 'description' => 'upload a file to moodle', + 'type' => 'write', + 'classpath' => 'files/externallib.php', + ), // === user related functions === 'moodle_user_create_users' => array(