//
文件上傳類:
功能:實現文件上傳。本類僅僅供初學者參考,具體需求還需具體分析。
<?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年的合作,并且還持續合作中!