"MDL-23823 allow users pick same file multi times in html editor"
[moodle.git] / repository / upload / lib.php
CommitLineData
a62542e0 1<?php
10d53fd3
DC
2
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/>.
17
a62542e0 18/**
e35194be 19 * A repository plugin to allow user uploading files
a62542e0 20 *
10d53fd3
DC
21 * @since 2.0
22 * @package moodlecore
23 * @subpackage repository
24 * @copyright 2009 Dongsheng Cai
25 * @author Dongsheng Cai <dongsheng@moodle.com>
e35194be 26 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
a62542e0 27 */
28
29class repository_upload extends repository {
e35194be 30 private $mimetypes = array();
a62542e0 31
96297ca2 32 /**
f3b38030 33 * Print a upload form
f3b38030 34 * @return array
96297ca2 35 */
f3b38030 36 public function print_login() {
a62542e0 37 return $this->get_listing();
38 }
39
f3b38030
DC
40 /**
41 * Process uploaded file
e35194be 42 * @return array|bool
f3b38030 43 */
7d9cb3b5 44 public function upload() {
e35194be 45 global $USER, $CFG;
900d4606 46
e35194be
DC
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 }
900d4606 54 }
7d9cb3b5 55
e35194be
DC
56 $record = new stdclass;
57 $record->filearea = 'draft';
58 $record->component = 'user';
64654e78 59 $record->filepath = optional_param('savepath', '/', PARAM_PATH);
e35194be
DC
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);
7d9cb3b5 63
1dce6261 64 $context = get_context_instance(CONTEXT_USER, $USER->id);
e35194be 65 $elname = 'repo_upload_file';
64f93798 66
1dce6261 67 $fs = get_file_storage();
f954e12e 68 $sm = get_string_manager();
7d9cb3b5 69
1dce6261 70 if ($record->filepath !== '/') {
e35194be 71 $record->filepath = file_correct_filepath($record->filepath);
7d9cb3b5
DC
72 }
73
74 if (!isset($_FILES[$elname])) {
75 throw new moodle_exception('nofile');
76 }
77
78 if (!empty($_FILES[$elname]['error'])) {
79 throw new moodle_exception('maxbytes');
80 }
81
1dce6261 82 if (empty($record->filename)) {
64654e78 83 $record->filename = clean_param($_FILES[$elname]['name'], PARAM_FILE);
7d9cb3b5
DC
84 }
85
e35194be
DC
86 if ($this->mimetypes != '*') {
87 // check filetype
f954e12e
MD
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);
e35194be
DC
94 }
95 }
96
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 }
101
1dce6261
DC
102 if (empty($record->itemid)) {
103 $record->itemid = 0;
7d9cb3b5 104 }
7d9cb3b5 105
64654e78 106 if ($file = $fs->get_file($context->id, $record->component, $record->filearea, $record->itemid, $record->filepath, $record->filename)) {
0f729672
DC
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 );
7d9cb3b5
DC
112 }
113
1dce6261
DC
114 $record->contextid = $context->id;
115 $record->userid = $USER->id;
116 $record->source = '';
7d9cb3b5 117
e35194be 118 $stored_file = $fs->create_file_from_pathname($record, $_FILES[$elname]['tmp_name']);
1dce6261 119
7d9cb3b5 120 return array(
50a8bd6c 121 'url'=>moodle_url::make_draftfile_url($record->itemid, $record->filepath, $record->filename)->out(),
1dce6261 122 'id'=>$record->itemid,
e35194be
DC
123 'file'=>$record->filename);
124 }
125
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 }
141
e35194be
DC
142 /**
143 * supported return types
144 * @return int
145 */
146 public function supported_returntypes() {
147 return FILE_INTERNAL;
148 }
149
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) {
7d9cb3b5 160 }
a62542e0 161}