<?php
class FileUpload{
private $filepath; //設置上傳文件的路徑
private $allowtype=array('jpg','jpeg','gif','bmp'); //默認的文件的類型
private $maxsize=2000000; //默認文件的大小
private $israndname=true; //是否使用隨機文件名
private $originName; //源文件名稱
private $tmpFileName; //臨時文件名
private $fileType; //文件類型
private $fileSize; //文件的大小
private $newFileName; //新文件的名稱
private $errorNum; //錯誤號
private $errorMess=""; //用來提示錯誤報告
//用於文件初始化的函數
function __construct($options=array()){
foreach($options as $key=>$val){
$key=strtolower($key);//設置屬性名稱均為小寫
//get_class_vars(get_class($this))
//獲取當前類的所有的屬性
if(!in_array($key,get_class_vars(get_class($this)))){
continue;
}
else
{
$this->setOption($key,$val);
}
}
}
//定義不同的錯誤級別
private function getError(){
$str="<font color='red'>上傳文件{$this->originName}時出錯:";
switch($this->errorNum){
case 4:
$str.="文件沒有被上傳";
break;
case 3:
$str.="文件只有部分上傳";
break;
case 2:
$str.="上傳文件超過了HTML表單中規定的MAX_FILE_SIZE選項的值";
break;
case 1:
$str.="上傳文件吵過了php.ini中upload_max_filesize選項的值";
break;
case -1:
$str.="未允許的類型";
break;
case -2:
$str.="上傳文件過大,不能超過{$this->maxSize}個字節";
break;
case -3:
$str.="上傳失敗";
break;
case -4:
$str.="建立存放上傳目錄失敗,請重新指定上傳目錄";
break;
case -5:
$str.="必須指定上傳文件的路徑";
break;
default:
$str.="未知的錯誤";
}
return $str."</font><br/>";
}
//為成員屬性賦值的函數
private function setOption($key,$val){
$this->$key=$val;
}
//用於檢查上傳文件的路徑
private function checkFilePath(){
//如果文件路徑為空
if(empty($this->filepath)){
$this->setOption('errorNum',-5);
return false;
}
//判斷路徑是否存在並且是否可寫
if(!file_exists($this->filepath)||!is_writable($this->filepath)){
//@是錯誤抑制符 @ 是忽略錯誤提示,使其錯
//誤消息不會顯示在程序裡
if(!@mkdir($this->filepath,0755)){
$this->setOption('errorNum',-4);
return false;
}
}
return true;
}
//檢查文件大小的函數
private function checkFileSize(){
if($this->fileSize>$this->maxsize){
$this->setOption("errorNum",-2);
return false;
}
else
{
return true;
}
}
//檢查上傳文件的類型
private function checkFileType(){
if(in_array(strtolower($this->fileType),$this->allowtype))
{
return true;
}
else
{
$this->setOption("errorNum",-1);
return false;
}
}
//上傳一個文件
function uploadFile($fileField){
$return=true;
$name=$_FILES[$fileField]["name"]; //post提交的名稱
$tmp_name=$_FILES[$fileField]["tmp_name"]; //上傳時的臨時文件名
$size=$_FILES[$fileField]["size"];
$error=$_FILES[$fileField]["error"];
if($this->setFiles($name,$tmp_name,$size,$error)){
if($this->checkFileSize() && $this->checkFileType()){
$this->setNewFileName();
if($this->copyFile())
{
$return=true;
}
else
{
$return=false;
}
}
else
{
$return=false;
}
}
else
{
$return=false;
}
//檢查文件的路徑是否存在錯誤
if(!$this->checkFilePath()){
$this->errorMess=$this->getError();
return false;
}
if(!$return)
{
$this->errorMess=$this->getError();
}
return $return;
}
//設置和$_FILES有關的內容
private function setFiles($name="",$tmp_name="",$size=0,$error=0){
$this->setOption("errorNum",$error);
if($this->errorNum){
return false;
}
$arrstr=explode(".",$name);
$this->setOption("fileType",strtolower($arrstr[count($arrstr)-1]));
$this->setOption("originName",$name);
$this->setOption("tmpFileName",$tmp_name);
$this->setOption("fileSize",$size);
return true;
}
//用於獲取上傳文件後文件的名稱
function getNewFileName(){
return $this->newFileName.'上傳成功!';
}
//上傳文件失敗時,顯示錯誤信息的函數
function getErrorMsg(){
return $this->errorMess;
}
private function proRandName(){
$filename=date("YmdHis").rand(100,999);
return $filename.".".$this->fileType;
}
//設置上傳後的文件名稱
private function setNewFileName(){
if($this->israndname){
$this->setOption('newFileName',$this->proRandName());
}
else
{
$this->setOption('newFileName',$this->originName);
}
}
//拷貝文件
private function copyFile(){
if(!$this->errorNum){
$filepath=rtrim($this->filepath,'/')."/";
$filepath.=$this->newFileName;
//將文件拷貝到指定的路徑當中
if(@move_uploaded_file($this->tmpFileName,$filepath)){
return true;
}
else
{
$this->setOption('errorNum',-3);
return false;
}
}
}
}
?>