1 <?php 2 /* vim: set expandtab tabstop=4 shiftwidth=4: */ 3 // +----------------------------------------------------------------------+ 4 // | PHP version 4.0 | 5 // +----------------------------------------------------------------------+ 6 // | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group | 7 // +----------------------------------------------------------------------+ 8 // | This source file is subject to version 2.0 of the PHP license, | 9 // | that is bundled with this package in the file LICENSE, and is | 10 // | available at through the world-wide-web at | 11 // | http://www.php.net/license/2_02.txt. | 12 // | If you did not receive a copy of the PHP license and are unable to | 13 // | obtain it through the world-wide-web, please send a note to | 14 // | license@php.net so we can mail you a copy immediately. | 15 // +----------------------------------------------------------------------+ 16 // | Authors: Adam Daniel <adaniel1@eesus.jnj.com> | 17 // | Bertrand Mansion <bmansion@mamasam.com> | 18 // +----------------------------------------------------------------------+ 19 // 20 // $Id$ 21 22 require_once("HTML/QuickForm/input.php"); 23 24 // register file-related rules 25 if (class_exists('HTML_QuickForm')) { 26 HTML_QuickForm::registerRule('uploadedfile', 'callback', '_ruleIsUploadedFile', 'HTML_QuickForm_file'); 27 HTML_QuickForm::registerRule('maxfilesize', 'callback', '_ruleCheckMaxFileSize', 'HTML_QuickForm_file'); 28 HTML_QuickForm::registerRule('mimetype', 'callback', '_ruleCheckMimeType', 'HTML_QuickForm_file'); 29 HTML_QuickForm::registerRule('filename', 'callback', '_ruleCheckFileName', 'HTML_QuickForm_file'); 30 } 31 32 /** 33 * HTML class for a file type element 34 * 35 * @author Adam Daniel <adaniel1@eesus.jnj.com> 36 * @author Bertrand Mansion <bmansion@mamasam.com> 37 * @version 1.0 38 * @since PHP4.04pl1 39 * @access public 40 */ 41 class HTML_QuickForm_file extends HTML_QuickForm_input 42 { 43 // {{{ properties 44 45 /** 46 * Uploaded file data, from $_FILES 47 * @var array 48 */ 49 var $_value = null; 50 51 // }}} 52 // {{{ constructor 53 54 /** 55 * Class constructor 56 * 57 * @param string Input field name attribute 58 * @param string Input field label 59 * @param mixed (optional)Either a typical HTML attribute string 60 * or an associative array 61 * @since 1.0 62 * @access public 63 */ 64 public function __construct($elementName=null, $elementLabel=null, $attributes=null) { 65 parent::__construct($elementName, $elementLabel, $attributes); 66 $this->setType('file'); 67 } //end constructor 68 69 /** 70 * Old syntax of class constructor. Deprecated in PHP7. 71 * 72 * @deprecated since Moodle 3.1 73 */ 74 public function HTML_QuickForm_file($elementName=null, $elementLabel=null, $attributes=null) { 75 debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER); 76 self::__construct($elementName, $elementLabel, $attributes); 77 } 78 79 // }}} 80 // {{{ setSize() 81 82 /** 83 * Sets size of file element 84 * 85 * @param int Size of file element 86 * @since 1.0 87 * @access public 88 */ 89 function setSize($size) 90 { 91 $this->updateAttributes(array('size' => $size)); 92 } //end func setSize 93 94 // }}} 95 // {{{ getSize() 96 97 /** 98 * Returns size of file element 99 * 100 * @since 1.0 101 * @access public 102 * @return int 103 */ 104 function getSize() 105 { 106 return $this->getAttribute('size'); 107 } //end func getSize 108 109 // }}} 110 // {{{ freeze() 111 112 /** 113 * Freeze the element so that only its value is returned 114 * 115 * @access public 116 * @return bool 117 */ 118 function freeze() 119 { 120 return false; 121 } //end func freeze 122 123 // }}} 124 // {{{ setValue() 125 126 /** 127 * Sets value for file element. 128 * 129 * Actually this does nothing. The function is defined here to override 130 * HTML_Quickform_input's behaviour of setting the 'value' attribute. As 131 * no sane user-agent uses <input type="file">'s value for anything 132 * (because of security implications) we implement file's value as a 133 * read-only property with a special meaning. 134 * 135 * @param mixed Value for file element 136 * @since 3.0 137 * @access public 138 */ 139 function setValue($value) 140 { 141 return null; 142 } //end func setValue 143 144 // }}} 145 // {{{ getValue() 146 147 /** 148 * Returns information about the uploaded file 149 * 150 * @since 3.0 151 * @access public 152 * @return array 153 */ 154 function getValue() 155 { 156 return $this->_value; 157 } // end func getValue 158 159 // }}} 160 // {{{ onQuickFormEvent() 161 162 /** 163 * Called by HTML_QuickForm whenever form event is made on this element 164 * 165 * @param string Name of event 166 * @param mixed event arguments 167 * @param object calling object 168 * @since 1.0 169 * @access public 170 * @return bool 171 */ 172 function onQuickFormEvent($event, $arg, &$caller) 173 { 174 switch ($event) { 175 case 'updateValue': 176 if ($caller->getAttribute('method') == 'get') { 177 return self::raiseError('Cannot add a file upload field to a GET method form'); 178 } 179 $this->_value = $this->_findValue(); 180 $caller->updateAttributes(array('enctype' => 'multipart/form-data')); 181 $caller->setMaxFileSize(); 182 break; 183 case 'addElement': 184 $this->onQuickFormEvent('createElement', $arg, $caller); 185 return $this->onQuickFormEvent('updateValue', null, $caller); 186 break; 187 case 'createElement': 188 static::__construct($arg[0], $arg[1], $arg[2], $arg[3], $arg[4]); 189 break; 190 } 191 return true; 192 } // end func onQuickFormEvent 193 194 // }}} 195 // {{{ moveUploadedFile() 196 197 /** 198 * Moves an uploaded file into the destination 199 * 200 * @param string Destination directory path 201 * @param string New file name 202 * @access public 203 * @return bool Whether the file was moved successfully 204 */ 205 function moveUploadedFile($dest, $fileName = '') 206 { 207 if ($dest != '' && substr($dest, -1) != '/') { 208 $dest .= '/'; 209 } 210 $fileName = ($fileName != '') ? $fileName : basename($this->_value['name']); 211 if (move_uploaded_file($this->_value['tmp_name'], $dest . $fileName)) { 212 return true; 213 } else { 214 return false; 215 } 216 } // end func moveUploadedFile 217 218 // }}} 219 // {{{ isUploadedFile() 220 221 /** 222 * Checks if the element contains an uploaded file 223 * 224 * @access public 225 * @return bool true if file has been uploaded, false otherwise 226 */ 227 function isUploadedFile() 228 { 229 return $this->_ruleIsUploadedFile($this->_value); 230 } // end func isUploadedFile 231 232 // }}} 233 // {{{ _ruleIsUploadedFile() 234 235 /** 236 * Checks if the given element contains an uploaded file 237 * 238 * @param array Uploaded file info (from $_FILES) 239 * @access private 240 * @return bool true if file has been uploaded, false otherwise 241 */ 242 function _ruleIsUploadedFile($elementValue) 243 { 244 if ((isset($elementValue['error']) && $elementValue['error'] == 0) || 245 (!empty($elementValue['tmp_name']) && $elementValue['tmp_name'] != 'none')) { 246 return is_uploaded_file($elementValue['tmp_name']); 247 } else { 248 return false; 249 } 250 } // end func _ruleIsUploadedFile 251 252 // }}} 253 // {{{ _ruleCheckMaxFileSize() 254 255 /** 256 * Checks that the file does not exceed the max file size 257 * 258 * @param array Uploaded file info (from $_FILES) 259 * @param int Max file size 260 * @access private 261 * @return bool true if filesize is lower than maxsize, false otherwise 262 */ 263 function _ruleCheckMaxFileSize($elementValue, $maxSize) 264 { 265 if (!empty($elementValue['error']) && 266 (UPLOAD_ERR_FORM_SIZE == $elementValue['error'] || UPLOAD_ERR_INI_SIZE == $elementValue['error'])) { 267 return false; 268 } 269 if (!HTML_QuickForm_file::_ruleIsUploadedFile($elementValue)) { 270 return true; 271 } 272 return ($maxSize >= @filesize($elementValue['tmp_name'])); 273 } // end func _ruleCheckMaxFileSize 274 275 // }}} 276 // {{{ _ruleCheckMimeType() 277 278 /** 279 * Checks if the given element contains an uploaded file of the right mime type 280 * 281 * @param array Uploaded file info (from $_FILES) 282 * @param mixed Mime Type (can be an array of allowed types) 283 * @access private 284 * @return bool true if mimetype is correct, false otherwise 285 */ 286 function _ruleCheckMimeType($elementValue, $mimeType) 287 { 288 if (!HTML_QuickForm_file::_ruleIsUploadedFile($elementValue)) { 289 return true; 290 } 291 if (is_array($mimeType)) { 292 return in_array($elementValue['type'], $mimeType); 293 } 294 return $elementValue['type'] == $mimeType; 295 } // end func _ruleCheckMimeType 296 297 // }}} 298 // {{{ _ruleCheckFileName() 299 300 /** 301 * Checks if the given element contains an uploaded file of the filename regex 302 * 303 * @param array Uploaded file info (from $_FILES) 304 * @param string Regular expression 305 * @access private 306 * @return bool true if name matches regex, false otherwise 307 */ 308 function _ruleCheckFileName($elementValue, $regex) 309 { 310 if (!HTML_QuickForm_file::_ruleIsUploadedFile($elementValue)) { 311 return true; 312 } 313 return preg_match($regex, $elementValue['name']); 314 } // end func _ruleCheckFileName 315 316 // }}} 317 // {{{ _findValue() 318 319 /** 320 * Tries to find the element value from the values array 321 * 322 * Needs to be redefined here as $_FILES is populated differently from 323 * other arrays when element name is of the form foo[bar] 324 * 325 * @access private 326 * @return mixed 327 */ 328 function _findValue() 329 { 330 if (empty($_FILES)) { 331 return null; 332 } 333 $elementName = $this->getName(); 334 if (isset($_FILES[$elementName])) { 335 return $_FILES[$elementName]; 336 } elseif (false !== ($pos = strpos($elementName, '['))) { 337 $base = substr($elementName, 0, $pos); 338 $idx = "['" . str_replace(array(']', '['), array('', "']['"), substr($elementName, $pos + 1, -1)) . "']"; 339 $props = array('name', 'type', 'size', 'tmp_name', 'error'); 340 $code = "if (!isset(\$_FILES['{$base}']['name']{$idx})) {\n" . 341 " return null;\n" . 342 "} else {\n" . 343 " \$value = array();\n"; 344 foreach ($props as $prop) { 345 $code .= " \$value['{$prop}'] = \$_FILES['{$base}']['{$prop}']{$idx};\n"; 346 } 347 return eval($code . " return \$value;\n}\n"); 348 } else { 349 return null; 350 } 351 } 352 353 // }}} 354 } // end class HTML_QuickForm_file 355 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body