"MDL-23823 allow users pick same file multi times in html editor"
[moodle.git] / repository / upload / lib.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * A repository plugin to allow user uploading files
20  *
21  * @since 2.0
22  * @package moodlecore
23  * @subpackage repository
24  * @copyright 2009 Dongsheng Cai
25  * @author Dongsheng Cai <dongsheng@moodle.com>
26  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27  */
29 class repository_upload extends repository {
30     private $mimetypes = array();
32     /**
33      * Print a upload form
34      * @return array
35      */
36     public function print_login() {
37         return $this->get_listing();
38     }
40     /**
41      * Process uploaded file
42      * @return array|bool
43      */
44     public function upload() {
45         global $USER, $CFG;
47         $types = optional_param('accepted_types', '*', PARAM_RAW);
48         if ((is_array($types) and in_array('*', $types)) or $types == '*') {
49             $this->mimetypes = '*';
50         } else {
51             foreach ($types as $type) {
52                 $this->mimetypes[] = mimeinfo('type', $type);
53             }
54         }
56         $record = new stdclass;
57         $record->filearea = 'draft';
58         $record->component = 'user';
59         $record->filepath = optional_param('savepath', '/', PARAM_PATH);
60         $record->itemid   = optional_param('itemid', 0, PARAM_INT);
61         $record->license  = optional_param('license', $CFG->sitedefaultlicense, PARAM_TEXT);
62         $record->author   = optional_param('author', '', PARAM_TEXT);
64         $context = get_context_instance(CONTEXT_USER, $USER->id);
65         $elname = 'repo_upload_file';
67         $fs = get_file_storage();
68         $sm = get_string_manager();
70         if ($record->filepath !== '/') {
71             $record->filepath = file_correct_filepath($record->filepath);
72         }
74         if (!isset($_FILES[$elname])) {
75             throw new moodle_exception('nofile');
76         }
78         if (!empty($_FILES[$elname]['error'])) {
79             throw new moodle_exception('maxbytes');
80         }
82         if (empty($record->filename)) {
83             $record->filename = clean_param($_FILES[$elname]['name'], PARAM_FILE);
84         }
86         if ($this->mimetypes != '*') {
87             // check filetype
88             $filemimetype = mimeinfo('type', $_FILES[$elname]['name']);
89             if (!in_array($filemimetype, $this->mimetypes)) {
90                 if ($sm->string_exists($filemimetype, 'mimetypes')) {
91                     $filemimetype = get_string($filemimetype, 'mimetypes');
92                 }
93                 throw new moodle_exception('invalidfiletype', 'repository', '', $filemimetype);
94             }
95         }
97         $userquota = file_get_user_used_space();
98         if (filesize($_FILES[$elname]['tmp_name'])+$userquota>=(int)$CFG->userquota) {
99             throw new file_exception('userquotalimit');
100         }
102         if (empty($record->itemid)) {
103             $record->itemid = 0;
104         }
106         if ($file = $fs->get_file($context->id, $record->component, $record->filearea, $record->itemid, $record->filepath, $record->filename)) {
107             return array(
108                 'url'=>moodle_url::make_draftfile_url($file->get_itemid(), $file->get_filepath(), $file->get_filename())->out(),
109                 'id'=>$file->get_itemid(),
110                 'file'=>$file->get_filename()
111             );
112         }
114         $record->contextid = $context->id;
115         $record->userid    = $USER->id;
116         $record->source    = '';
118         $stored_file = $fs->create_file_from_pathname($record, $_FILES[$elname]['tmp_name']);
120         return array(
121             'url'=>moodle_url::make_draftfile_url($record->itemid, $record->filepath, $record->filename)->out(),
122             'id'=>$record->itemid,
123             'file'=>$record->filename);
124     }
126     /**
127      * Return a upload form
128      * @return array
129      */
130     public function get_listing() {
131         global $CFG;
132         $ret = array();
133         $ret['nologin']  = true;
134         $ret['nosearch'] = true;
135         $ret['norefresh'] = true;
136         $ret['list'] = array();
137         $ret['dynload'] = false;
138         $ret['upload'] = array('label'=>get_string('attachment', 'repository'), 'id'=>'repo-form');
139         return $ret;
140     }
142     /**
143      * supported return types
144      * @return int
145      */
146     public function supported_returntypes() {
147         return FILE_INTERNAL;
148     }
150     /**
151      * Upload file to local filesystem pool
152      * @param string $elname name of element
153      * @param string $filearea
154      * @param string $filepath
155      * @param string $filename - use specified filename, if not specified name of uploaded file used
156      * @param bool $override override file if exists
157      * @return mixed stored_file object or false if error; may throw exception if duplicate found
158      */
159     public function upload_to_filepool($elname, $record, $override = true) {
160     }