php文件上传

慕课网学习笔记

文件上传原理:
将客户端的文件上传到服务器端,再将服务器端的临时文件移动到指定目录即可。


客户端配置:
1、表单页面
2、表单发送方式为post
3、添加enctype="multipart/form-data"


服务器端配置
1、file_uploads=On //支持http上传
2、upload_tmp_dir=临时文件保存的目录
3、upload_max_filesize=2M //允许文件上传的最大值
4、max_file_uploads=20 //允许一次上传的最大文件数
5、post_max_size=8M //post发送数据的最大值
6、max_execution_time=-1
//设置了脚本被解析器终止之前允许的最大执行时间,单位为妙,防止程序写的不好而占尽服务器资源
7、max_input_time=60 //脚本解析器输入数据允许的最大时间,单位是妙
8、max_input_nesting_level=64 //设置输入变量的嵌套深度
9、memory_limit=128M //最大单线程的独立内存使用量,也就是一个web请求,给予线程最大的内存使用量的定义
10、max_input_vars=1000 
//接受多少输入变量(限制分别应用于$_GET,$_POST,$_COOKIE超全局变量)质量的使用减轻了哈希碰撞来进行拒绝
服务攻击的可能性。如有超过指令指定数量的变量,将会导致E_WARNING的产生,更多的输入变量将会从请求中截断。


$_FILES //文件上传变量
 //将服务器上的临时文件移动到指定目录下
move_uploaded_file($tmp_name,$destination)
copy($src,$dst) //成功返回true,否则false

<input multiple="multiple"/>  <!--  允许使用ctrl键多文件选中  -->


<?php 
class upload{
	protected $fileName;//上传文件框名称
	protected $maxSize;
	protected $allowMime;
	protected $allowExt;
	protected $uploadPath;
	protected $imgFlag;//为true,表明需要检测上传文件是否为图片类型
	protected $fileInfo;//注意这只是单文件信息
	protected $error;
	protected $ext;
	/**
	 * @param string $fileName
	 * @param string $uploadPath
	 * @param string $imgFlag
	 * @param number $maxSize
	 * @param array $allowExt
	 * @param array $allowMime
	 */
	public function __construct($fileName='myFile',$uploadPath='./uploads',$imgFlag=true,$maxSize=5242880,$allowExt=array('jpeg','jpg','png','gif'),$allowMime=array('image/jpeg','image/png','image/gif')){
		$this->fileName=$fileName;
		$this->maxSize=$maxSize;
		$this->allowMime=$allowMime;
		$this->allowExt=$allowExt;
		$this->uploadPath=$uploadPath;
		$this->imgFlag=$imgFlag;
		$this->fileInfo=$_FILES[$this->fileName];
	}
	/**
	 * 检测上传文件是否出错
	 * @return boolean
	 */
	protected function checkError(){
		if(!is_null($this->fileInfo)){
			if($this->fileInfo['error']>0){
				switch($this->fileInfo['error']){
					case 1:
						$this->error='超过了PHP配置文件中upload_max_filesize选项的值';
						break;
					case 2:
						$this->error='超过了表单中MAX_FILE_SIZE设置的值';
						break;
					case 3:
						$this->error='文件部分被上传';
						break;
					case 4:
						$this->error='没有选择上传文件';
						break;
					case 6:
						$this->error='没有找到临时目录';
						break;
					case 7:
						$this->error='文件不可写';
						break;
					case 8:
						$this->error='由于PHP的扩展程序中断文件上传';
						break;
						
				}
				return false;
			}else{
				return true;
			}
		}else{
			$this->error='文件上传出错';
			return false;
		}
	}
	/**
	 * 检测上传文件的大小
	 * @return boolean
	 */
	protected function checkSize(){
		if($this->fileInfo['size']>$this->maxSize){
			$this->error='上传文件过大';
			return false;
		}
		return true;
	}
	/**
	 * 检测扩展名
	 * @return boolean
	 */
	protected function checkExt(){
		$this->ext=strtolower(pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION));
		if(!in_array($this->ext,$this->allowExt)){
			$this->error='不允许的扩展名';
			return false;
		}
		return true;
	}
	/**
	 * 检测文件的类型
	 * @return boolean
	 */
	protected function checkMime(){
		if(!in_array($this->fileInfo['type'],$this->allowMime)){
			$this->error='不允许的文件类型';
			return false;
		}
		return true;
	}
	/**
	 * 检测是否是真实图片
	 * @return boolean
	 */
	protected function checkTrueImg(){
		if($this->imgFlag){
			if(!@getimagesize($this->fileInfo['tmp_name'])){
				$this->error='不是真实图片';
				return false;
			}
			return true;
		}
	}
	/**
	 * 检测是否通过HTTP POST方式上传上来的
	 * @return boolean
	 */
	protected function checkHTTPPost(){
		if(!is_uploaded_file($this->fileInfo['tmp_name'])){
			$this->error='文件不是通过HTTP POST方式上传上来的';
			return false;
		}
		return true;
	}
	/**
	 *显示错误 
	 */
	protected function showError(){
		exit('<span style="color:red">'.$this->error.'</span>');
	}
	/**
	 * 检测目录不存在则创建
	 */
	protected function checkUploadPath(){
		if(!file_exists($this->uploadPath)){
			mkdir($this->uploadPath,0777,true);
		}
	}
	/**
	 * 产生唯一字符串
	 * @return string
	 */
	protected function getUniName(){
		return md5(uniqid(microtime(true),true));
	}
	/**
	 * 上传文件
	 * @return string
	 */
	public function uploadFile(){
		if($this->checkError()&&$this->checkSize()&&$this->checkExt()&&$this->checkMime()&&$this->checkTrueImg()&&$this->checkHTTPPost()){
			$this->checkUploadPath();
			$this->uniName=$this->getUniName();
			$this->destination=$this->uploadPath.'/'.$this->uniName.'.'.$this->ext;
			if(@move_uploaded_file($this->fileInfo['tmp_name'], $this->destination)){
				return  $this->destination;
			}else{
				$this->error='文件移动失败';
				$this->showError();
			}
		}else{
			$this->showError();
		}
	}
}



但上面的是单文件,若是多文件,则可以用下面这个函数取得各个单文件

function buildInfo(){
    if(!$_FILES){
        return;
    }
    $i=0;
    //单文件
    foreach ($_FILES as $v){
        if(is_string($v['name'])){
            $files[$i]=$v;
            $i++;
        }
        //多文件
        else{
            foreach ($v['name'] as $key=>$val){
                $files[$i]['name']=$v['name'][$key];
                $files[$i]['size']=$v['size'][$key];
                $files[$i]['tmp_name']=$v['tmp_name'][$key];
                $files[$i]['type']=$v['type'][$key];
                $files[$i]['error']=$v['error'][$key];
                $i++;
            }
        }
    }
    return $files;
}

上述得到的$files数组中,可能存在空值,可以通过array_values(array_filter($files))来过滤空值,重新排列



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值