首页 » 后端 » PHP » 正文

文件上传类upfile.class.php

发布者:站点默认
2011/01/24 浏览数(2,345) 分类:PHP 文件上传类upfile.class.php已关闭评论

说明:

PHP文件上传类,可设置允许上传的文件扩展名、是否自动创建下级目录。

用法:

<?php
include('upfile.class.php');
if (isset($_GET['up'])){
	$up = new upile("upload");
	$result = $up->upload('upfile'); // HTML中<input />的name属性值
	echo '结果:' . $result; // 如果成功返回地址,否则返回FALSE,错误信息保存在“$up->error”。
	if (!$up->error){
		echo '成功';
	}else{
		echo '失败,错误信息:' . $up->error;
	}
}
?>
<form method="post" action="?up" enctype="multipart/form-data"> 
<input type="file" name="upfile"><br><br> 
<input type="submit" value="上传"> 
</form> 

下载:

upfile.class.php.tar.gz (为什么此附件的地址不能分享给朋友们下载?)

代码:

<?php
// 说明:上传类
// 日期:14:40 2010/5/26 周三
class upfile{
	public $denyType = 'asp,php,aspx,jsp,html,js,vbs'; // 拒绝上传的扩展名(不是文件类型!)
	public $uploadFolder = ''; // 存放目录(末尾不要加“/”)
	public $error = ''; // 错误信息
	public $autoSubfolder = TRUE; // 是否自动创建子目录
	public $SubfolderFormat = 'Y-m'; // 子目录格式(使用DATE函数的格式)
	public $filePath = ''; // 上传成功后的URL
	
	// 说明:初始化
	function __construct($uploadFolder = 'upload'){
		$this->uploadFolder = $uploadFolder;
	}
	
	// 说明:上传,参数是<input />的name属性值;成功返回相对URL,失败返回FALSE和错误信息(在$this->error里)
	// bool/sting upload(string $html_tags_input_attrib_name);
	function upload($inputName){ // 上传操作,参数是input标签的name属性。
		$this->_mkdir(); // 创建存放目录
		if ($this->error){ // 如果有错,直接返回(例如_mkdir)
			return FALSE;
		}
		if(!$_FILES[$inputName]["name"]){
			$this->error = '没有上传文件';
			return FALSE;
		}
		if($_FILES[$inputName]["name"]){
			$isUpFile = $_FILES[$inputName]['tmp_name'];
			if (is_uploaded_file($isUpFile)){
				$extName = $this->_checkType($_FILES[$inputName]["name"]);
				if (FALSE == $extName){
					return FALSE;
				}
				$microSenond = floor(microtime()*10000);// 取一个毫秒级数字,4位。
				$newFileName = $uploadFolder . '/' . date('YmdHis') . $microSenond . '.' . $extName ; // 所上传文件的新名字。
				$location = $this->uploadFolder . $newFileName;
				$result = @move_uploaded_file($isUpFile, $location);
				if ($result){
					$this->filePath = $location;
					return $location;
				}else{
					$this->error = '移动临时文件时出错';
					return FALSE;
				}
			}else{
				$uploadError = $_FILES[$inputName]['error'];
				if (1 == $uploadError){ // 文件大小超过了php.ini中的upload_max_filesize
					$this->error = '文件太大,服务器拒绝接收大于' . ini_get('upload_max_filesize') . '的文件';
					return FALSE;
				}elseif (3 == $uploadError){ // 上传了部分文件
					$this->error = '上传中断,请重试';
					return FALSE;
				}elseif (4 == $uploadError){
					$this->error = '没有文件被上传';
					return FALSE;
				}elseif (6 == $uploadError){
					$this->error = '找不到临时文件夹,请联系您的服务器管理员';
					return FALSE;
				}elseif (7 == $uploadError){
					$this->error = '文件写入失败,请联系您的服务器管理员';
					return FALSE;
				}else{
					if (0 != $uploadError){
						$this->error = '未知上传错误,请联系您的服务器管理员';
						return FALSE;
					}
				}
			}
		}
	}
	
	// 检测扩展名是否允许(因未知扩展名太多,故不严格检测(只据扩展名,不据文件头))
	private function _checkType($file){
		$extName = preg_replace('/.*\.(.*[^\.].*)*/iU','\\1', $file);
		if (empty($extName)){
			$extName = 'unKnown';
		}
		$denyTypes = strtolower($this->denyType); // 先转成小写
		$denyTypes = explode(',', $this->denyType); // 再分解数组
		foreach ($denyTypes as $ext){
			$ext = strtolower($ext);
			if ($extName == $ext){
				$this->error = '不允许上传的文件类型:' . $extName;
				return FALSE;
			}
		}
		if (!$this->error){
			return $extName;
		}
	}

	// 说明:存放目录
	private function _mkdir(){ // 创建上传目录
		// 基目录是否可写
		$baseDir = dirname($this->uploadFolder);
		if(!is_writable($baseDir)){
			$this->error = '基目录不可写';
			return FALSE;
		}
		// 创建目录
		if(!is_dir($this->uploadFolder)){
			$mkdirResutlt = @mkdir($this->uploadFolder);
			if (!$mkdirResutlt){
				$this->error = '存放文件的目录创建失败';
				return FALSE;
			}
		}
		// 创建子目录
		if($this->autoSubfolder){
			$subFolder = date($this->SubfolderFormat);
			$newUploadFolder = $this->uploadFolder . '/' . $subFolder;
			if(!is_dir($newUploadFolder)){
				$mkdirResutlt = @mkdir($newUploadFolder);
				if(!$mkdirResutlt){
					$this->error = '子目录创建失败';
					return FALSE;
				}
			}
			$this->uploadFolder = $newUploadFolder;
		}
	}
}
?>

相关阅读

<完>

点击返回顶部
  1. 留言
  2. 联系方式