From 7d9cb3b51a7a8a58bf34ca77b5bae385b19d0c46 Mon Sep 17 00:00:00 2001 From: Dongsheng Cai Date: Fri, 13 Nov 2009 05:31:02 +0000 Subject: [PATCH] "MDL-20824, use php exception to processs the file which excess the maximum file size" --- lang/en_utf8/error.php | 1 + repository/lib.php | 56 ----------- repository/repository.src.js | 5 +- repository/repository_ajax.php | 9 +- repository/upload/repository.class.php | 126 ++++++++++++++++++------- 5 files changed, 100 insertions(+), 97 deletions(-) diff --git a/lang/en_utf8/error.php b/lang/en_utf8/error.php index e38aa7a1d0..a1c133098d 100644 --- a/lang/en_utf8/error.php +++ b/lang/en_utf8/error.php @@ -304,6 +304,7 @@ $string['listcantmoveright'] = 'Failed to move item right, as there is no peer t $string['loginasonecourse'] = 'You cannot enter this course.
You have to terminate the \"Login as\" session before entering any other course.'; $string['loginasnoenrol'] = 'You cannot use enrol or unenrol when in course \"Login as\" session'; $string['logfilenotavailable'] = 'Logs not available'; +$string['maxbytes'] = 'This file is bigger than the maximum size'; $string['messagingdisable'] = 'Messaging is disabled on this site'; $string['missingfield'] = 'Field \"$a\" is missing'; $string['missingkeyinsql'] = 'ERROR: missing param \"$a\" in query'; diff --git a/repository/lib.php b/repository/lib.php index 469dcf18f9..b91d0d5c11 100644 --- a/repository/lib.php +++ b/repository/lib.php @@ -844,62 +844,6 @@ abstract class repository { } } - /** - * Upload file to local filesystem pool - * @param string $elname name of element - * @param string $filearea - * @param string $filepath - * @param string $filename - use specified filename, if not specified name of uploaded file used - * @param bool $override override file if exists - * @return mixed stored_file object or false if error; may throw exception if duplicate found - */ - public static function upload_to_filepool($elname, $filearea='user_draft', $filepath='/', $itemid='', $filename = '', $override = false) { - global $USER; - - if ($filepath !== '/') { - $filepath = trim($filepath, '/'); - $filepath = '/'.$filepath.'/'; - } - - if (!isset($_FILES[$elname])) { - return false; - } - - if (!$filename) { - $filename = $_FILES[$elname]['name']; - } - $context = get_context_instance(CONTEXT_USER, $USER->id); - if (empty($itemid)) { - $itemid = (int)substr(hexdec(uniqid()), 0, 9)+rand(1,100); - } - $fs = get_file_storage(); - $browser = get_file_browser(); - - if ($file = $fs->get_file($context->id, $filearea, $itemid, $filepath, $filename)) { - if ($override) { - $file->delete(); - } else { - return false; - } - } - - $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; - - $file = $fs->create_file_from_pathname($file_record, $_FILES[$elname]['tmp_name']); - $info = $browser->get_file_info($context, $file->get_filearea(), $file->get_itemid(), $file->get_filepath(), $file->get_filename()); - return array( - 'url'=>$info->get_url(), - 'id'=>$itemid, - 'file'=>$file->get_filename() - ); - } - /** * Return the user files tree in a format to be returned by the function get_listing * @global object $CFG diff --git a/repository/repository.src.js b/repository/repository.src.js index d518942240..49e44b34e5 100644 --- a/repository/repository.src.js +++ b/repository/repository.src.js @@ -1147,14 +1147,13 @@ repository_client.upload = function(client_id) { repository_client.upload_cb = { upload: function(o) { var ret = repository_client.parse_json(o.responseText, 'upload'); - client_id = ret.client_id; if(ret && ret.e) { - var panel = new YAHOO.util.Element('panel-'+client_id); + var panel = new YAHOO.util.Element('panel-'+ret.client_id); panel.get('element').innerHTML = ret.e; return; } if(ret) { - repository_client.end(client_id, ret); + repository_client.end(ret.client_id, ret); } } } diff --git a/repository/repository_ajax.php b/repository/repository_ajax.php index b3d6048a8e..6253097a76 100755 --- a/repository/repository_ajax.php +++ b/repository/repository_ajax.php @@ -279,11 +279,12 @@ EOD; break; case 'upload': try { - $upload = $repo->get_listing(); - $upload['client_id'] = $client_id; - echo json_encode($upload); - } catch (repository_exception $e){ + $result = $repo->upload(); + $result['client_id'] = $client_id; + echo json_encode($result); + } catch (Exception $e){ $err->e = $e->getMessage(); + $err->client_id = $client_id; die(json_encode($err)); } break; diff --git a/repository/upload/repository.class.php b/repository/upload/repository.class.php index a142ef52cd..836dba1237 100755 --- a/repository/upload/repository.class.php +++ b/repository/upload/repository.class.php @@ -10,68 +10,126 @@ class repository_upload extends repository { /** * - * @global object $SESSION - * @global string $action - * @global object $CFG * @param int $repositoryid * @param object $context * @param array $options */ public function __construct($repositoryid, $context = SITEID, $options = array()){ - global $_FILES, $SESSION, $action, $CFG; parent::__construct($repositoryid, $context, $options); - $itemid = optional_param('itemid', '', PARAM_INT); - $filepath = optional_param('savepath', '/', PARAM_PATH); - if($action=='upload'){ - $this->info = repository::upload_to_filepool('repo_upload_file', 'user_draft', $filepath, $itemid); - } + $this->itemid = optional_param('itemid', '', PARAM_INT); + $this->filepath = optional_param('savepath', '/', PARAM_PATH); } /** * - * @global object $SESSION * @param boolean $ajax * @return mixed */ public function print_login($ajax = true) { - global $SESSION; return $this->get_listing(); } - /** - * - * @global object $CFG - * @global string $action - * @param mixed $path - * @param string $search - * @return array - */ - public function get_listing($path='', $page='') { - global $CFG, $action; - if($action=='upload'){ - return $this->info; - }else{ - $ret = array(); - $ret['nologin'] = true; - $ret['nosearch'] = true; - // define upload form in file picker - $ret['upload'] = array('label'=>get_string('attachment', 'repository'), 'id'=>'repo-form'); - $ret['manage'] = $CFG->wwwroot .'/files/index.php'; // temporary - $ret['list'] = array(); - $ret['dynload'] = false; - return $ret; + public function upload() { + try { + $this->info = $this->upload_to_filepool('repo_upload_file', 'user_draft', $this->filepath, $this->itemid); + } catch(Exception $e) { + throw $e; } + return $this->info; + } + + public function get_listing() { + $ret = array(); + $ret['nologin'] = true; + $ret['nosearch'] = true; + // define upload form in file picker + $ret['upload'] = array('label'=>get_string('attachment', 'repository'), 'id'=>'repo-form'); + $ret['manage'] = $CFG->wwwroot .'/files/index.php'; // temporary + $ret['list'] = array(); + $ret['dynload'] = false; + return $ret; } /** - * + * Define the name of this repository * @return string */ public function get_name(){ return get_string('repositoryname', 'repository_upload'); } + + /** + * supported return types + * @return int + */ public function supported_returntypes() { return FILE_INTERNAL; } + + /** + * Upload file to local filesystem pool + * @param string $elname name of element + * @param string $filearea + * @param string $filepath + * @param string $filename - use specified filename, if not specified name of uploaded file used + * @param bool $override override file if exists + * @return mixed stored_file object or false if error; may throw exception if duplicate found + */ + public function upload_to_filepool($elname, $filearea='user_draft', $filepath='/', $itemid='', $filename = '', $override = false) { + global $USER; + + if ($filepath !== '/') { + $filepath = trim($filepath, '/'); + $filepath = '/'.$filepath.'/'; + } + + if (!isset($_FILES[$elname])) { + throw new moodle_exception('nofile'); + } + + if (!empty($_FILES[$elname]['error'])) { + throw new moodle_exception('maxbytes'); + } + + if (!$filename) { + $filename = $_FILES[$elname]['name']; + } + + $context = get_context_instance(CONTEXT_USER, $USER->id); + if (empty($itemid)) { + $itemid = (int)substr(hexdec(uniqid()), 0, 9)+rand(1,100); + } + $fs = get_file_storage(); + $browser = get_file_browser(); + + if ($file = $fs->get_file($context->id, $filearea, $itemid, $filepath, $filename)) { + if ($override) { + $file->delete(); + } else { + 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; + + try { + $file = $fs->create_file_from_pathname($file_record, $_FILES[$elname]['tmp_name']); + } catch (Exception $e) { + $e->obj = $_FILES[$elname]; + throw $e; + } + $info = $browser->get_file_info($context, $file->get_filearea(), $file->get_itemid(), $file->get_filepath(), $file->get_filename()); + return array( + 'url'=>$info->get_url(), + 'id'=>$itemid, + 'file'=>$file->get_filename() + ); + } } -- 2.39.5