PHP文件上传

一个简单的封装好的文件上传处理类,可解决多文件同时上传。将图片和图片之外的文件分别存放在不同目录下

文件上传处理页:

<?php
//文件上传
class upload{
	//文件上传大小
	public $size=2097152;
	//文件保存目录
	public $path;
	//文件上传表单
	public $field;
	//错误信息
	public $error;
	//上传成功文件信息
	public $uploadFiles=array();
	//文件保存地址
	public $filesave="D:/WWW/PHPDemo/tool/upload/files";
	//图片保存地址
	public $imgsave="D:/WWW/PHPDemo/tool/upload/img";
	
	/*
	 * 构造函数
	 * @param $path 保存路径
	 * */
	function __construct($path=''){	
		$this->path=empty($path)?$this->filesave:$path;
	}
	
	//文件上传
	public function upload(){
		if(!$this->checkDir()){
			$this->error="目录".$this->path."创建失败或者不可写";
			return false;
		}
		$files=$this->format();
		//var_dump($files);
		//exit;
		foreach($files as $v){
			
			$info=pathinfo($v['name']);
			//var_dump($info);//查看$info中的信息;
			//exit;
			//echo $info['extentsion'];
			//exit;
			$v['ext']=$info['extension'];//得到文件扩展名
			$v['filename']=$info['filename'];//得到文件名
			//echo $v['ext'];
			//exit;
			if(!$this->checkFile($v)){
				continue;
			}
			$uploadFile=$this->save($v);
			if($uploadFile){
				$this->uploadFiles[]=$uploadFile;
			}
		}
	}
	
	//存储验证后的上传文件,$file:上传文件数组
	private function save($file){
		$is_img=0;//是否是图片文件
		$filePath=$this->path.'/'.$file['filename'].time().".".$file['ext'];
		//echo $filePath."<br/>";
		//exit;
		//var_dump($file);
		
		if(in_array($file['ext'],array("jpg","jpeg","gif","bmp","png")) && getimagesize($file['tmp_name'])){
			$filePath=$this->imgsave.'/'.time().".".$file['ext'];
			$is_img=1;
			move_uploaded_file($file['tmp_name'], $filePath);
		}
		//echo $filePath."<br/>";
		//保存文件
		if(!move_uploaded_file($file['tmp_name'], $filePath)){//move_uploaded_file — 将上传的文件移动到新位置 
			$this->error="上传文件失败";
			return false;
		}
		if(!$is_img){
			return array("path"=>$filePath);
		}
	}
	
	
	//目录验证,如果目录不存在则创建
	private function checkDir(){
		$path=$this->path;
		if(!self::create($path) || !is_writeable($path)){
			return false;
		}
		$img_path=$this->imgsave;
		
		if(!self::create($img_path) || !is_writeable($img_path)){
			return false;
		}
		return true;
	}
	
	//将所有上传的文件(可能是多维数组)存储到$info数组中(一维数组)
	private function format(){
		$files=$_FILES;
		//var_dump($files);//可能是多为数组
		if(!isset($files)){
			$this->error="没有上传任何文件";
			return false;
		}
		$info=array();//把上传的文件都存储在$info中,不管上传的是以数组形式还是单个文件上传
		$n=0;
		foreach($files as $v){//通过var_dump($_FILES)可以获知上传文件的信息
			if(is_array($v['name'])){//如果上传的是数组文件
				$count=count($v['name']);
				for($i=0;$i<$count;$i++){
					foreach($v as $m=>$k){
						$info[$n][$m]=$k[$i];
					}
					$n++;
				}	
			}else{//如果是单个文件
				$info[$n]=$v;
				$n++;
			}
		}
		return $info;
	}
	
	//验证上传文件
	private function checkFile($file){
		if($file['error']!=0){//文件中有个属性叫error
			$this->error=$this->error($file['error']);
			return false;
		}

		$ext=strtolower($file['ext']);//文件扩展名
		
		if($file['size']>$this->size){//文件中有size属性
			$this->error="文件上传过大";
			return false;
		}
		if(!is_uploaded_file($file['tmp_name'])){//is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的 
			$this->error="非法文件";
			return false;
		}
		return true;
	}
	
	//获得错误类型
	private function error($type){
		switch($type){
			case UPLOAD_ERR_INI_SIZE:
				$this->error="超过PHP.INI配置文件指定大小";
				break;
			case UPLOAD_ERR_FORM_SIZE:
				$this->error="上传文件超过HTML表单指定打下";
				break;
			case UPLOAD_ERR_NO_FILE:
				$this->error="没有上传任何文件";
				break;
			case UPLOAD_ERR_PARTIAL:
				$this->error="文件只上传了一部分";
				break;
			case UPLOAD_ERR_NO_TMP_DIR:
				$this->error="没有上传的临时文件";
				break;
			case UPLOAD_ERR_CANT_WRITE:
				$this->error="不能写入临时上传文件";
				break;
		}
	}
	
	
	public function geterror(){
		return $this->error;
	}
	
	//转换为标准目录结构
	static function dir_path($dirname){
		$dirname=str_ireplace('\\','/',$dirname);//将\转换为/
		return substr($dirname,-1)=='/'?$dirname:$dirname.'/';//目录最后带/
	}
	
	//支持层级的目录结构创建
	static function create($dirname,$auth="0777"){
		$dirPath=self::dir_path($dirname);
		if(is_dir($dirPath)){
			return true;
		}
		$dirArr=explode("/",$dirPath);//将目录逐级拆分放到数组中
		//var_dump($dirArr);
		$dir='';
		foreach($dirArr as $v){
			$dir.=$v.'/';
			//echo $dir."<br/>";
			if(is_dir($dir)){
				continue;//如果目录存在则跳过循环
			}
			mkdir($dir,$auth);//创建目录
		}
		return is_dir($dirPath);
	}
}
//测试
$up=new upload();
$up->upload();


文件上传页;

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="post" action="upload.php" enctype="multipart/form-data">
文件1<input type="file" name="up0[]"/><br/>
文件2<input type="file" name="up0[]"/><br/>
文件3<input type="file" name="up1"/><br/>
文件4<input type="file" name="up2"/><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值