一个简单的封装好的文件上传处理类,可解决多文件同时上传。将图片和图片之外的文件分别存放在不同目录下
文件上传处理页:
<?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>