0edc42ca6679ff08d1cff9e1f5c7e815f6d5ae50
[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    repository
23  * @subpackage upload
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($saveas_filename, $maxbytes) {
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         }
77         if (!empty($_FILES[$elname]['error'])) {
78             switch ($_FILES[$elname]['error']) {
79             case UPLOAD_ERR_INI_SIZE:
80                 throw new moodle_exception('upload_error_ini_size', 'repository_upload');
81                 break;
82             case UPLOAD_ERR_FORM_SIZE:
83                 throw new moodle_exception('upload_error_form_size', 'repository_upload');
84                 break;
85             case UPLOAD_ERR_PARTIAL:
86                 throw new moodle_exception('upload_error_partial', 'repository_upload');
87                 break;
88             case UPLOAD_ERR_NO_FILE:
89                 throw new moodle_exception('upload_error_no_file', 'repository_upload');
90                 break;
91             case UPLOAD_ERR_NO_TMP_DIR:
92                 throw new moodle_exception('upload_error_no_tmp_dir', 'repository_upload');
93                 break;
94             case UPLOAD_ERR_CANT_WRITE:
95                 throw new moodle_exception('upload_error_cant_write', 'repository_upload');
96                 break;
97             case UPLOAD_ERR_EXTENSION:
98                 throw new moodle_exception('upload_error_extension', 'repository_upload');
99                 break;
100             default:
101                 throw new moodle_exception('nofile');
102             }
103         }
105         if (empty($saveas_filename)) {
106             $record->filename = clean_param($_FILES[$elname]['name'], PARAM_FILE);
107         } else {
108             $record->filename = $saveas_filename;
109         }
111         if ($this->mimetypes != '*') {
112             // check filetype
113             $filemimetype = mimeinfo('type', $_FILES[$elname]['name']);
114             if (!in_array($filemimetype, $this->mimetypes)) {
115                 if ($sm->string_exists($filemimetype, 'mimetypes')) {
116                     $filemimetype = get_string($filemimetype, 'mimetypes');
117                 }
118                 throw new moodle_exception('invalidfiletype', 'repository', '', $filemimetype);
119             }
120         }
122         if (empty($record->itemid)) {
123             $record->itemid = 0;
124         }
126         if (($maxbytes!==-1) && (filesize($_FILES[$elname]['tmp_name']) > $maxbytes)) {
127             throw new file_exception('maxbytes');
128         }
130         if ($file = $fs->get_file($context->id, $record->component, $record->filearea, $record->itemid, $record->filepath, $record->filename)) {
131             throw new moodle_exception('fileexists', 'repository');
132         }
134         $record->contextid = $context->id;
135         $record->userid    = $USER->id;
136         $record->source    = '';
138         $stored_file = $fs->create_file_from_pathname($record, $_FILES[$elname]['tmp_name']);
140         return array(
141             'url'=>moodle_url::make_draftfile_url($record->itemid, $record->filepath, $record->filename)->out(),
142             'id'=>$record->itemid,
143             'file'=>$record->filename);
144     }
146     /**
147      * Return a upload form
148      * @return array
149      */
150     public function get_listing() {
151         global $CFG;
152         $ret = array();
153         $ret['nologin']  = true;
154         $ret['nosearch'] = true;
155         $ret['norefresh'] = true;
156         $ret['list'] = array();
157         $ret['dynload'] = false;
158         $ret['upload'] = array('label'=>get_string('attachment', 'repository'), 'id'=>'repo-form');
159         return $ret;
160     }
162     /**
163      * supported return types
164      * @return int
165      */
166     public function supported_returntypes() {
167         return FILE_INTERNAL;
168     }
170     /**
171      * Upload file to local filesystem pool
172      * @param string $elname name of element
173      * @param string $filearea
174      * @param string $filepath
175      * @param string $filename - use specified filename, if not specified name of uploaded file used
176      * @param bool $override override file if exists
177      * @return mixed stored_file object or false if error; may throw exception if duplicate found
178      */
179     public function upload_to_filepool($elname, $record, $override = true) {
180     }