diff options
Diffstat (limited to 'framework/web/CUploadedFile.php')
| -rw-r--r-- | framework/web/CUploadedFile.php | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/framework/web/CUploadedFile.php b/framework/web/CUploadedFile.php new file mode 100644 index 0000000..60f04c0 --- /dev/null +++ b/framework/web/CUploadedFile.php @@ -0,0 +1,274 @@ +<?php +/** + * CUploadedFile class file. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @link http://www.yiiframework.com/ + * @copyright Copyright © 2008-2011 Yii Software LLC + * @license http://www.yiiframework.com/license/ + */ + +/** + * CUploadedFile represents the information for an uploaded file. + * + * Call {@link getInstance} to retrieve the instance of an uploaded file, + * and then use {@link saveAs} to save it on the server. + * You may also query other information about the file, including {@link name}, + * {@link tempName}, {@link type}, {@link size} and {@link error}. + * + * @property string $name The original name of the file being uploaded. + * @property string $tempName The path of the uploaded file on the server. + * Note, this is a temporary file which will be automatically deleted by PHP + * after the current request is processed. + * @property string $type The MIME-type of the uploaded file (such as "image/gif"). + * Since this MIME type is not checked on the server side, do not take this value for granted. + * Instead, use {@link CFileHelper::getMimeType} to determine the exact MIME type. + * @property integer $size The actual size of the uploaded file in bytes. + * @property integer $error The error code. + * @property boolean $hasError Whether there is an error with the uploaded file. + * Check {@link error} for detailed error code information. + * @property string $extensionName The file extension name for {@link name}. + * The extension name does not include the dot character. An empty string + * is returned if {@link name} does not have an extension name. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id: CUploadedFile.php 3515 2011-12-28 12:29:24Z mdomba $ + * @package system.web + * @since 1.0 + */ +class CUploadedFile extends CComponent +{ + static private $_files; + + private $_name; + private $_tempName; + private $_type; + private $_size; + private $_error; + + /** + * Returns an instance of the specified uploaded file. + * The file should be uploaded using {@link CHtml::activeFileField}. + * @param CModel $model the model instance + * @param string $attribute the attribute name. For tabular file uploading, this can be in the format of "[$i]attributeName", where $i stands for an integer index. + * @return CUploadedFile the instance of the uploaded file. + * Null is returned if no file is uploaded for the specified model attribute. + * @see getInstanceByName + */ + public static function getInstance($model, $attribute) + { + return self::getInstanceByName(CHtml::resolveName($model, $attribute)); + } + + /** + * Returns all uploaded files for the given model attribute. + * @param CModel $model the model instance + * @param string $attribute the attribute name. For tabular file uploading, this can be in the format of "[$i]attributeName", where $i stands for an integer index. + * @return array array of CUploadedFile objects. + * Empty array is returned if no available file was found for the given attribute. + */ + public static function getInstances($model, $attribute) + { + return self::getInstancesByName(CHtml::resolveName($model, $attribute)); + } + + /** + * Returns an instance of the specified uploaded file. + * The name can be a plain string or a string like an array element (e.g. 'Post[imageFile]', or 'Post[0][imageFile]'). + * @param string $name the name of the file input field. + * @return CUploadedFile the instance of the uploaded file. + * Null is returned if no file is uploaded for the specified name. + */ + public static function getInstanceByName($name) + { + if(null===self::$_files) + self::prefetchFiles(); + + return isset(self::$_files[$name]) && self::$_files[$name]->getError()!=UPLOAD_ERR_NO_FILE ? self::$_files[$name] : null; + } + + /** + * Returns an array of instances for the specified array name. + * + * If multiple files were uploaded and saved as 'Files[0]', 'Files[1]', + * 'Files[n]'..., you can have them all by passing 'Files' as array name. + * @param string $name the name of the array of files + * @return array the array of CUploadedFile objects. Empty array is returned + * if no adequate upload was found. Please note that this array will contain + * all files from all subarrays regardless how deeply nested they are. + */ + public static function getInstancesByName($name) + { + if(null===self::$_files) + self::prefetchFiles(); + + $len=strlen($name); + $results=array(); + foreach(array_keys(self::$_files) as $key) + if(0===strncmp($key, $name, $len) && self::$_files[$key]->getError()!=UPLOAD_ERR_NO_FILE) + $results[] = self::$_files[$key]; + return $results; + } + + /** + * Cleans up the loaded CUploadedFile instances. + * This method is mainly used by test scripts to set up a fixture. + * @since 1.1.4 + */ + public static function reset() + { + self::$_files=null; + } + + /** + * Initially processes $_FILES superglobal for easier use. + * Only for internal usage. + */ + protected static function prefetchFiles() + { + self::$_files = array(); + if(!isset($_FILES) || !is_array($_FILES)) + return; + + foreach($_FILES as $class=>$info) + self::collectFilesRecursive($class, $info['name'], $info['tmp_name'], $info['type'], $info['size'], $info['error']); + } + /** + * Processes incoming files for {@link getInstanceByName}. + * @param string $key key for identifiing uploaded file: class name and subarray indexes + * @param mixed $names file names provided by PHP + * @param mixed $tmp_names temporary file names provided by PHP + * @param mixed $types filetypes provided by PHP + * @param mixed $sizes file sizes provided by PHP + * @param mixed $errors uploading issues provided by PHP + */ + protected static function collectFilesRecursive($key, $names, $tmp_names, $types, $sizes, $errors) + { + if(is_array($names)) + { + foreach($names as $item=>$name) + self::collectFilesRecursive($key.'['.$item.']', $names[$item], $tmp_names[$item], $types[$item], $sizes[$item], $errors[$item]); + } + else + self::$_files[$key] = new CUploadedFile($names, $tmp_names, $types, $sizes, $errors); + } + + /** + * Constructor. + * Use {@link getInstance} to get an instance of an uploaded file. + * @param string $name the original name of the file being uploaded + * @param string $tempName the path of the uploaded file on the server. + * @param string $type the MIME-type of the uploaded file (such as "image/gif"). + * @param integer $size the actual size of the uploaded file in bytes + * @param integer $error the error code + */ + public function __construct($name,$tempName,$type,$size,$error) + { + $this->_name=$name; + $this->_tempName=$tempName; + $this->_type=$type; + $this->_size=$size; + $this->_error=$error; + } + + /** + * String output. + * This is PHP magic method that returns string representation of an object. + * The implementation here returns the uploaded file's name. + * @return string the string representation of the object + */ + public function __toString() + { + return $this->_name; + } + + /** + * Saves the uploaded file. + * @param string $file the file path used to save the uploaded file + * @param boolean $deleteTempFile whether to delete the temporary file after saving. + * If true, you will not be able to save the uploaded file again in the current request. + * @return boolean true whether the file is saved successfully + */ + public function saveAs($file,$deleteTempFile=true) + { + if($this->_error==UPLOAD_ERR_OK) + { + if($deleteTempFile) + return move_uploaded_file($this->_tempName,$file); + else if(is_uploaded_file($this->_tempName)) + return copy($this->_tempName, $file); + else + return false; + } + else + return false; + } + + /** + * @return string the original name of the file being uploaded + */ + public function getName() + { + return $this->_name; + } + + /** + * @return string the path of the uploaded file on the server. + * Note, this is a temporary file which will be automatically deleted by PHP + * after the current request is processed. + */ + public function getTempName() + { + return $this->_tempName; + } + + /** + * @return string the MIME-type of the uploaded file (such as "image/gif"). + * Since this MIME type is not checked on the server side, do not take this value for granted. + * Instead, use {@link CFileHelper::getMimeType} to determine the exact MIME type. + */ + public function getType() + { + return $this->_type; + } + + /** + * @return integer the actual size of the uploaded file in bytes + */ + public function getSize() + { + return $this->_size; + } + + /** + * Returns an error code describing the status of this file uploading. + * @return integer the error code + * @see http://www.php.net/manual/en/features.file-upload.errors.php + */ + public function getError() + { + return $this->_error; + } + + /** + * @return boolean whether there is an error with the uploaded file. + * Check {@link error} for detailed error code information. + */ + public function getHasError() + { + return $this->_error!=UPLOAD_ERR_OK; + } + + /** + * @return string the file extension name for {@link name}. + * The extension name does not include the dot character. An empty string + * is returned if {@link name} does not have an extension name. + */ + public function getExtensionName() + { + if(($pos=strrpos($this->_name,'.'))!==false) + return (string)substr($this->_name,$pos+1); + else + return ''; + } +} |
