| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 | <?phpnamespace KIF;/** * @name 单文件上传类 * @desc 本控件主要对文件上传过程的监控,需要时可自动创建目标目录的上层目录。文件保存的路径和命名规则不在控件内设置。 * @author lishuming@kimiss.com * 使用方法 * $objUpload = new \KIF\Upload($custom_config); * $objUpload->execute(); *  * @param array 自定义配置参数 * $custom_config = array( * 		'save_path'	=> '/tmp/dir/', (必填)文件保存路径 * 		'save_filename'	=> 'name', (选填)保存文件名。不需要添加文件后缀。留空时使用原名 * 		'file_type'	=> '', (必填)上传文件类型 * 		'field'	=> 'myFile', (必填)客户端文件上传控件名,input 中的表单名 * 		... * ); */use KIF\Data\ResultWrapper;class Upload {		/**	 * 上传文件控件配置	 * @var array	 */	private $config = array();		/**	 * 上传文件控件默认配置	 * @var array	 */	private $default_config = array(		'save_path'		=> '',		//文件保存目录路径。格式:/tmp/dir/		'save_filename'	=> null,		//保存文件名。默认为空时使用原名		'file_type'		=> '', //上传文件的类型。可选项有:image,flash,media,file		'allow_ext_arr'	=> array(	//定义允许上传文件的扩展名			'image'		=> array('gif', 'jpg', 'jpeg', 'png', 'bmp'),			'flash'		=> array('swf', 'flv'),			'media'		=> array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),			'file'		=> array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2'),		),		'max_size'		=> 1000000,	//允许上传最大文件的大小 (单位字节)		'field'			=> '',		//客户端文件上传控件名,input 中的表单名		'dchmod'		=> 0777,	//新创建的目录权限设置		'fchmod'		=> 0777,	//新创建的文件权限设置	);		public function __construct(/*自定义配置*/$custom_config = array()) {		if (!empty($custom_config)) {			$this->config = array_merge($this->default_config, $custom_config);		} else {			$this->config = $this->default_config;		}	}		public function execute() {		if (!$this->config['save_path']) {			return ResultWrapper::fail('请设置文件保存路径。');		}		$save_path = rtrim($this->config['save_path'], DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;				if (!$this->config['file_type']) {			return ResultWrapper::fail('请设置上传文件类型。');		}		$file_type = $this->config['file_type'];				if (!$this->config['field']) {			return ResultWrapper::fail('请设置客户端文件上传控件名。');		}		$field = $this->config['field'];				$ext_arr = $this->config['allow_ext_arr'];				$max_size = $this->config['max_size'];				if (empty($_FILES)) {			return ResultWrapper::fail('没有需要上传的文件。');		}				#保存文件名		if (!$this->config['save_filename']) {			$save_filename = $_FILES[$field]['name'];		}		$save_filename = $this->config['save_filename'];				#原文件名		$file_name = $_FILES[$field]['name'];				#检查文件名		if (!$file_name) {			return ResultWrapper::fail('请选择上传文件。');		}				#服务器上临时文件名		$tmp_name = $_FILES[$field]['tmp_name'];				#文件大小		$file_size = $_FILES[$field]['size'];				#检查是否已上传		if (@is_uploaded_file($tmp_name) === false) {			return ResultWrapper::fail("临时文件可能不是上传文件。");		}				#检查文件大小		if ($file_size > $max_size) {			return ResultWrapper::fail("上传文件大小超过限制。");		}				#获得文件扩展名		$file_ext = $this->getExtension($file_name);		#检查扩展名		if (in_array($file_ext, $ext_arr[$file_type]) === false) {			return ResultWrapper::fail("上传文件扩展名是不允许的扩展名。");		}				#检查目录		if (@is_dir($save_path) === false) {			#创建目录			if (!mkdir($save_path, intval($this->config['dchmod']), true)) {				return ResultWrapper::fail("创建目录失败:{$save_path}");			}		}				#检查目录写权限		if (@is_writable($save_path) === false) {			return ResultWrapper::fail("上传目录没有写权限。");		}				#移动文件		$file_path = $save_path . $save_filename . '.' . $file_ext;		if (move_uploaded_file($tmp_name, $file_path) === false) {			return ResultWrapper::fail("上传文件失败。");		}				@chmod($file_path, intval($this->config['fchmod']));				return ResultWrapper::success(array(			'file_path'	=> $file_path,		));	}		/**	 * 获取文件扩展名	 * @param string $filename	 * @return string	 */	static public function getExtension($filename) {		$temp_arr = explode(".", $filename);		$file_ext = array_pop($temp_arr);		$file_ext = trim($file_ext);		return strtolower($file_ext);	}	}
 |