//
文件上传类:
功能:实现文件上传。本类仅仅供初学者参考,具体需求还需具体分析。
<?php
class fileup{
private $filepath='./';//文件路径
private $allowmime=array(//准许MIME
'image/jpeg',
'image/jpg',
'image/pjpeg',
'image/gif',
'image/png',
'image/x-png'
);
private $allowsub=array('jpg','jpeg','png','gif');//准许后缀
private $maxsize=2000000;//准许大小
private $subfix;//当前的后缀名
private $israndname=true;//是否启用随机文件名
private $size;//当前的大小
private $orgname;//文件原名
private $mime;//当前的MIME
private $tmpname;//临时文件名
private $errornum;//错误号
private $errorinfo;//错误信息
private $prefix='up_';//前缀
private $newfilename;//组合得到的新文件名
/*============初始化成员方法==========
*通过这里的修改方法我们可以在初始化的时候,方便修改成员属性
*$arr=array(
* 'filepath'=>'images',
* 'allowsize'=>'3000000',
* 'allowmime'=>array('传一个数组'),
* 'allowsub'=>array('传一个数组'),
* 'israndname'=>'1',
* 'prefix'=>'wx_'
*);
* */
public function __construct($array=array('filepath'=>'../www/')){
foreach($array as $key=>$val){
$key=strtolower($key);
if(!array_key_exists($key,get_class_vars(get_class($this)))){
//如果不存在成员属性的数组里,设置错误号
$this->setoption('error','-8');
echo $this->geterror();//报错提示错误号
continue;
}
//调用成员方法然后修改成员属性
$this->setoption($key,$val);
}
}
//修改成员属性的方法
private function setoption($key,$val){
$this->$key=$val;
}
//文件上传方法
public function up($field){
if(!$this->checkpath()){//第一步,检测路径是否存在
return false;
}
$flag=false;//第二步,执行多文件上传的时候做一个标记位置
//第三步,获得上传文件属性值,赋给变量
$name=$_FILES[$field]['name'];
$size=$_FILES[$field]['size'];
$tmpname=$_FILES[$field]['tmp_name'];
$mime=$_FILES[$field]['type'];
$error=$_FILES[$field]['error'];
//第四步,判断是不是多文件上传
if(is_array($name)){
//处理多文件上传处理
for($i=0,$j=count($name);$i<$j;$i++){
if($this->setfiles($name[$i],$size[$i],$tmpname[$i],$mime[$i],$error[$i])){
if(!$this->checksize()|!$this->checksub()|!$this->checkmime()){
$errorinfo[]=$this->geterror();
$flag=false;
}
}else{
$errorinfo[]=$this->geterror().'<br />';
$falg=false;
}
}
for($i=0,$j=count($name);$i<$j;$i++){
if($this->setfiles($name[$i],$size[$i],$tmpname[$i],$mime[$i],$error[$i])){
if($this->checksize()&&$this->checksub()&&$this->checkmime()){
$newfilename[]=$this->newfilename;
$this->move();
}
}
}
$this->newfilename=$newfilename;
if(!$flag){
$this->errorinfo=$errorinfo;
}
return $this->newfilename;
}else{
//执行单文件上传
//将这些的文件的属性赋值给成员属性
if($this->setfiles($name,$size,$tmpname,$mime,$error)){
//检测文件相关信息是否符合
if($this->checksize() && $this->checksub() && $this->checksub()){
if($this->move()){//移动文件
return $this->prefix.$this->newfilename;//返回上传的新文件名
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}
}
//将上传文件的属性赋值给成员属性
private function setfiles($name,$size,$tmpname,$mime,$error){
if($error){//如果存在错误号
$this->setoption('errornum',$error);
return false;
}
$this->orgname=$name;
$this->size=$size;
$this->tmpname=$tmpname;
$this->mime=$mime;
$subfix=explode('.',$this->orgname);
$this->subfix=array_pop($subfix);
//检测是否开启随机文件名,将文件名赋值给成员属性
if(!$this->israndname){
//不启用的话新文件名为前缀拼接原文件名
$this->newfilename=$this->prefix.$this->orgname;
}else{
//启用的话,调用创建新文件名的方法
$this->newfilename=$this->prefix.$this->createnewname();
}
return true;
}
//检测文件后缀是否符合
private function checksub(){
if(in_array($this->subfix,$this->allowsub)){
return true;
}else{
return false;
}
}
//检测文件的MIME类型
private function checkmime(){
if(in_array($this->mime,$this->allowmime)){
return true;
}else{
return false;
}
}
//检测文件的大小是否符合
private function checksize(){
if($this->size>$this->maxsize){
$this->setoption('errornum',-3);
return false;
}else{
return true;
}
}
//文件的移动的方法
private function move(){
if(is_uploaded_file($this->tmpname)){//检测是不是上传文件
//检测文件移动是否成功
if(move_uploaded_file($this->tmpname,$this->filepath.$this->newfilename)){
echo '文件上传成功';
return true;
}else{
$this->setoption('errornum',-7);
return false;
}
}else{
$this->setoption('errornum',-6);
return false;
}
}
//创建新文件名的方法
private function createnewname(){
return uniqid().'.'.$this->subfix;
}
//检测的路径
private function checkpath(){
if(empty($this->filepath)){
$this->setoption('errornum',-1);
return false;
}
$this->filepath=rtrim($this->filepath,'/').'/';
if(!file_exists($this->filepath) || !is_writeable($this->filepath)){
if(mkdir($this->filepath,0777,true)){
return true;
}else{
$this->setoption('errornum',-2);
return false;
}
}else{
return true;
}
}
public function geterror(){
switch($this->errornum){
case -1:
$string='请指定上传目录';
break;
case -2:
$string='文件路径穿件失败';
break;
case -3:
$string='文件超过了指定的大小';
break;
case -4:
$string='文件后缀不允许';
break;
case -5:
$string='文件的MIME类型不允许';
break;
case -6:
$string='不是上传文件';
break;
case -7:
$string='移动文件失败';
break;
case 1:
$string='超过了PHP指定的大小';
break;
case 2:
$string='超过了表单准许的大小';
break;
case 3:
$string='文件只有部分被上传';
break;
case 4:
$string='没有文件被上传';
break;
case 6:
$string='没有找到临时文件夹';
break;
case 7:
$string='文件写入失败';
break;
}
return $string;
}
}
?>
然成科技是一家本土的云南软件开发公司,2017年获得云南省科技厅、省财政厅、省税务局等机构认定的高新技术企业。定位于高端网站设计、系统开发、APP开发、微信公众号、微信小程序开发。拥有多个软著权,公司先后为多家事业单位提供服务,比如会泽文化馆、宣威文化馆、中科院昆明植物研究所等。其中中国科学院昆明植物研究所已经进行了长达4年的合作,并且还持续合作中!