|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00025 require_once 'Zend/Validate/Abstract.php'; 00026 00035 class Zend_Validate_File_Upload extends Zend_Validate_Abstract 00036 { 00040 const INI_SIZE = 'fileUploadErrorIniSize'; 00041 const FORM_SIZE = 'fileUploadErrorFormSize'; 00042 const PARTIAL = 'fileUploadErrorPartial'; 00043 const NO_FILE = 'fileUploadErrorNoFile'; 00044 const NO_TMP_DIR = 'fileUploadErrorNoTmpDir'; 00045 const CANT_WRITE = 'fileUploadErrorCantWrite'; 00046 const EXTENSION = 'fileUploadErrorExtension'; 00047 const ATTACK = 'fileUploadErrorAttack'; 00048 const FILE_NOT_FOUND = 'fileUploadErrorFileNotFound'; 00049 const UNKNOWN = 'fileUploadErrorUnknown'; 00055 protected $_messageTemplates = array( 00056 self::INI_SIZE => "File '%value%' exceeds the defined ini size", 00057 self::FORM_SIZE => "File '%value%' exceeds the defined form size", 00058 self::PARTIAL => "File '%value%' was only partially uploaded", 00059 self::NO_FILE => "File '%value%' was not uploaded", 00060 self::NO_TMP_DIR => "No temporary directory was found for file '%value%'", 00061 self::CANT_WRITE => "File '%value%' can't be written", 00062 self::EXTENSION => "A PHP extension returned an error while uploading the file '%value%'", 00063 self::ATTACK => "File '%value%' was illegally uploaded. This could be a possible attack", 00064 self::FILE_NOT_FOUND => "File '%value%' was not found", 00065 self::UNKNOWN => "Unknown error while uploading file '%value%'" 00066 ); 00067 00072 protected $_files = array(); 00073 00084 public function __construct($files = array()) 00085 { 00086 if ($files instanceof Zend_Config) { 00087 $files = $files->toArray(); 00088 } 00089 00090 $this->setFiles($files); 00091 } 00092 00100 public function getFiles($file = null) 00101 { 00102 if ($file !== null) { 00103 $return = array(); 00104 foreach ($this->_files as $name => $content) { 00105 if ($name === $file) { 00106 $return[$file] = $this->_files[$name]; 00107 } 00108 00109 if ($content['name'] === $file) { 00110 $return[$name] = $this->_files[$name]; 00111 } 00112 } 00113 00114 if (count($return) === 0) { 00115 require_once 'Zend/Validate/Exception.php'; 00116 throw new Zend_Validate_Exception("The file '$file' was not found"); 00117 } 00118 00119 return $return; 00120 } 00121 00122 return $this->_files; 00123 } 00124 00131 public function setFiles($files = array()) 00132 { 00133 if (count($files) === 0) { 00134 $this->_files = $_FILES; 00135 } else { 00136 $this->_files = $files; 00137 } 00138 00139 foreach($this->_files as $file => $content) { 00140 if (!isset($content['error'])) { 00141 unset($this->_files[$file]); 00142 } 00143 } 00144 00145 return $this; 00146 } 00147 00157 public function isValid($value, $file = null) 00158 { 00159 $this->_messages = null; 00160 if (array_key_exists($value, $this->_files)) { 00161 $files[$value] = $this->_files[$value]; 00162 } else { 00163 foreach ($this->_files as $file => $content) { 00164 if (isset($content['name']) && ($content['name'] === $value)) { 00165 $files[$file] = $this->_files[$file]; 00166 } 00167 00168 if (isset($content['tmp_name']) && ($content['tmp_name'] === $value)) { 00169 $files[$file] = $this->_files[$file]; 00170 } 00171 } 00172 } 00173 00174 if (empty($files)) { 00175 return $this->_throw($file, self::FILE_NOT_FOUND); 00176 } 00177 00178 foreach ($files as $file => $content) { 00179 $this->_value = $file; 00180 switch($content['error']) { 00181 case 0: 00182 if (!is_uploaded_file($content['tmp_name'])) { 00183 $this->_throw($file, self::ATTACK); 00184 } 00185 break; 00186 00187 case 1: 00188 $this->_throw($file, self::INI_SIZE); 00189 break; 00190 00191 case 2: 00192 $this->_throw($file, self::FORM_SIZE); 00193 break; 00194 00195 case 3: 00196 $this->_throw($file, self::PARTIAL); 00197 break; 00198 00199 case 4: 00200 $this->_throw($file, self::NO_FILE); 00201 break; 00202 00203 case 6: 00204 $this->_throw($file, self::NO_TMP_DIR); 00205 break; 00206 00207 case 7: 00208 $this->_throw($file, self::CANT_WRITE); 00209 break; 00210 00211 case 8: 00212 $this->_throw($file, self::EXTENSION); 00213 break; 00214 00215 default: 00216 $this->_throw($file, self::UNKNOWN); 00217 break; 00218 } 00219 } 00220 00221 if (count($this->_messages) > 0) { 00222 return false; 00223 } else { 00224 return true; 00225 } 00226 } 00227 00235 protected function _throw($file, $errorType) 00236 { 00237 if ($file !== null) { 00238 if (is_array($file) and !empty($file['name'])) { 00239 $this->_value = $file['name']; 00240 } 00241 } 00242 00243 $this->_error($errorType); 00244 return false; 00245 } 00246 }