<?php
/**
* 文件上传类
*/
header("Content-type:text/html;charset=utf-8");
class Upload {
// 上传文件保存路劲
private $savePath="./Uploads";
// 允许上传的文件后缀
private $allowExt=array("jpg","png","doc","docx","jpeg");
// 错误提示信息
private $errorMsg="";
// 允许上传的最大大小d单位M
private $maxSize=1;
//保存单例类的实例
static private $obj="";
// 是否返回原文件名的标志
private $flag=false;
final private function __construct(){}
/**
* 设置上传属性
* @param [type] $name [description]
* @param [type] $value [description]
*/
public function __set($name,$value){
$this->$name=$value;
}
/**
* 防止克隆对象
* @return [type] [description]
*/
final private function __clone() {}
/**
* 内部实例化
* @return object 返回实例化后的对象
*/
static public function getIns(){
if( !self::$obj instanceof self ){
return self::$obj=new self;
}
return self::$obj;
}
/**
* 获取上传文件的信息
* @return array 返回得到的信息
*/
private function getUplaodedFileInfo(){
$files="";
if( isset( $_FILES ) && !empty( $_FILES ) ){
foreach ($_FILES as $key => $file) {
if(is_string($file['name'])){//单文件形式的
// 排除没有选择的文件控件
if($file['name'])$files[]=$file;
}else{//数组形式的
$count=count($file['name']);
for ($i=0; $i <$count ; $i++) {
// 排除没有选择的文件控件
if(!$file['name'][$i]) continue;
$files[]=array(
'name'=>$file['name'][$i],
'type'=>$file['type'][$i],
'tmp_name'=>$file['tmp_name'][$i],
'error'=>$file['error'][$i],
'size'=>$file['size'][$i],
);
}
}
}
}
return $files;
}
/**
* 文件上传调度
* @param string 文件上传的input控件名字
* @return mixed 返回上传信息
*/
public function upload(){
$data="";
// 获取上传文件信息
$files=$this->getUplaodedFileInfo();
if( !$files ){
return "没有文件被上传";
}
foreach ($files as $key => $value) {
$data[]=$this->upload_one($value);
}
return $data;
}
/**
* 真正的文件上传
* @return mixed 返回上传的信息
*/
final private function upload_one($file){
// 检查错误号
if( $file['error'] !=0 ){
$this->error( $file['error'] );
return $this->errorMsg ;
}
// 检查文件后缀
if( !$this->checkExt( $file['name'] ) ){
return $file['name']."的类型不允许" ;
}
// 检查文件大小
if( !$this->checkSize($file['size']) ){
return $file['name']."文件超过程序".$this->maxSize."M大小的限制";
}
// 创建文件夹
if( !$this->creatDir( $this->savePath ) ){
return "文件夹创建失败";
}
// trim一下右斜杠再加上防止设置的时候没有添加右斜杠
$this->newname=$this->saveName( $file['name'] );
if( !move_uploaded_file( $file['tmp_name'] , trim($this->savePath,'/')."/". iconv('utf-8','gb2312',$this->newname) ) ){
return $file['name']."文件上传失败了!" ;
}
$this->errorMsg=$file['name']."文件上传成功";
return $successData = array(
"msg" => $this->errorMsg,
"oldname" => $file['name'],
"savepath" => $this->savePath,
"savename" => $this->newname
);
}
/**
* 创建文件夹
* @param string $path 创建的文件夹
* @return bool 返回是否创建成功
*/
public function creatDir($path){
return is_dir($path)? true : mkdir($path,0777,true);
}
/**
* 文件命名方式
* flag为真时返回带有原文件名的格式
* @param string $filename 上传的文件名
* @return string 返回重命名的文件
*/
private function saveName( $filename ){
$file_ext=pathinfo($filename,PATHINFO_EXTENSION);
if($this->flag){
$dotPos = strrpos( $filename, '.' );
$file_name = substr($filename, 0, $dotPos);
// 文件名去掉除下划线以外的其他符号
$preg="/[^\x{4e00}-\x{9fa5}|^\w|^\.]/iu";
$file_name=preg_replace($preg,"_",$file_name);
echo $file_name;
return $file_name."_".time()."_".mt_rand(1,999).".".$file_ext;
}
return uniqid().".".$file_ext;
}
/**
* 获取错误号
* @param num $errorNo 错误号
* @return string 错误对应的信息
*/
private function error($errorNo) {
switch ($errorNo) {
case 1:
$this->errorMsg = '上传的文件超过了程序限制的值!';
break;
case 2:
$this->errorMsg = '上传的文件超过了表单指定的值!';
break;
case 3:
$this->errorMsg = '文件只有部分被上传!';
break;
case 4:
$this->errorMsg = '没有文件被上传!';
break;
case 6:
$this->errorMsg = '找不到临时文件夹!';
break;
case 7:
$this->errorMsg = '文件写入失败!';
break;
default:
$this->errorMsg = '未知上传错误!';
}
}
/**
* 检查文件的大小
* @param string $size 文件的大小
* @return bool 返回检查的结果
*/
private function checkSize($size){
return $size < $this->maxSize*1024*1024;
}
/**
* 检查文件后缀
* @param [type] $filename [description]
* @return [type] [description]
*/
private function checkExt($filename){
return in_array( strtolower( pathinfo($filename,PATHINFO_EXTENSION) ), $this->allowExt );
}
}
if( isset($_POST['haha'] ) ){
$upload=Upload::getIns();
$upload->flag=true;
$upload->savePath="/test/".date("Ym")."/";
$data=$upload->upload();
var_dump($data);
}
?>
<!DOCTYPE html>
<html>
<head>
<title>asd</title>
</head>
<body>
<form method="post" action="" enctype="multipart/form-data">
<input type="file" name="myfile[]">
<input type="file" name="myfile[]">
<input type="file" name="myfile[]">
<input type="submit" name="haha" value="提交">
</form>
</body>
</html>