PHP文件上传类应用

时间:2022-09-29 18:49:16
<?php 

/**
* 步骤:
* 1.导入inlcude本类文件,如下函数upload 配置存储路径
* 2.直接运用,配合前台,运行函数,注意前台form打开enctype
* 3.若运行成功,转运文件至指定目录,获得返回值url物理全路径
* 4.把指定存储的路径存入数据库
*/




/**
* 文件上传函数,把文件保存到指定路径
* @param
* $filename:表单里写的文件名称 name="XXX" ,会自动识别$_FILES
* @return 成功返回图片存储物理全路径,失败返回false
*/

function upload($filename){
include_once(__ROOT__.'/common/Upload.class.php');//引入类文件
$path = __ROOT__."/public/upload/".date("Y-m-d",time());//定义路径
$upload = new upload($filename,$path);//实例化对象
$url = $upload->uploadFile();//调用成员方法,成功返回保存的物理地址
if(empty($url)){
return false;
}
return $url;
}

/**
* 修改会员信息
* @param $id 哪位会员 $data修改的值[数组形式]
* @return 成功返回影响行数 ;失败返回false
*/

function update_user($id,$data){
$info = get_user($id);//查询出此友情链接的信息
//判断有删除图片操作,清空图片地址
if(@$data['del_pic']){
unlink(__ROOT__.'/public/'.$info['user_img']);
unset($data['del_pic']);
$data['user_img'] = " ";
}
if(!empty($_FILES['user_img']['name'])){
@unlink(__ROOT__."/public/".$info['user_img']);//先删除原来文件exit;
$url = upload('user_img');//移动文件
if($url === false){
return false;
}
$data['user_img'] = strstr($url,"upload");//赋新地址值
}


$user = M('cms_user');

$data['password'] = md6($data['password'] );
$where = " user_id = $id ";
$re = $user->where($where)->data($data)->update();
// echo $link->getLastSql();exit;
if($re){
return true;
}
return false;
}

//--------------------------以上为类的应用方法----------------------
//------------------------------类开始-----------------------------
class Upload{
protected $fileName; //文件名称
protected $maxSize; //文件最大大小
protected $allowMime; //允许的图片范围
protected $allowExt; //允许的文件后缀名
protected $uploadPath; //设置文件上传路径
protected $imgFlag; //是否开启检测真实图像
protected $fileInfo;
protected $error;//返回的文件错误
protected $ext; //获取的文件后缀

public function __construct($fileName='myFile',$uploadPath='./uploads',$imgFlag=true,$maxSize=5242880,$allowExt=array('jpeg','jpg','png','gif'),$allowMime=array('image/jpeg','image/png','image/gif')){
$this->fileName=$fileName;
$this->maxSize=$maxSize;
$this->allowMime=$allowMime;
$this->allowExt=$allowExt;
$this->uploadPath=$uploadPath;
$this->imgFlag=$imgFlag;
$this->fileInfo=$_FILES[$this->fileName];
}
/**
* 检测上传文件是否出错
* @return boolean
*/

protected function checkError(){
if(!is_null($this->fileInfo)){
if($this->fileInfo['error']>0){
switch($this->fileInfo['error']){
case 1:
$this->error='超过了PHP配置文件中upload_max_filesize选项的值';
break;
case 2:
$this->error='超过了表单中MAX_FILE_SIZE设置的值';
break;
case 3:
$this->error='文件部分被上传';
break;
case 4:
$this->error='没有选择上传文件';
break;
case 6:
$this->error='没有找到临时目录';
break;
case 7:
$this->error='文件不可写';
break;
case 8:
$this->error='由于PHP的扩展程序中断文件上传';
break;

}
return false;
}else{
return true;
}
}else{
$this->error='文件上传出错';
return false;
}
}
/**
* 检测上传文件的大小
* @return boolean
*/

protected function checkSize(){
if($this->fileInfo['size']>$this->maxSize){
$this->error='上传文件过大';
return false;
}
return true;
}
/**
* 检测扩展名s
* @return boolean
*/

protected function checkExt(){
$this->ext=strtolower(pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION));
if(!in_array($this->ext,$this->allowExt)){
$this->error='不允许的扩展名';
return false;
}
return true;
}
/**
* 检测文件的类型
* @return boolean
*/

protected function checkMime(){
if(!in_array($this->fileInfo['type'],$this->allowMime)){
$this->error='不允许的文件类型';
return false;
}
return true;
}
/**
* 检测是否是真实图片
* @return boolean
*/

protected function checkTrueImg(){
if($this->imgFlag){
if(!@getimagesize($this->fileInfo['tmp_name'])){
$this->error='不是真实图片';
return false;
}
return true;
}
}
/**
* 检测是否通过HTTP POST方式上传上来的
* @return boolean
*/

protected function checkHTTPPost(){
if(!is_uploaded_file($this->fileInfo['tmp_name'])){
$this->error='文件不是通过HTTP POST方式上传上来的';
return false;
}
return true;
}
/**
*显示错误
*/

protected function showError(){
exit('<span style="color:red">'.$this->error.'</span>');
}
/**
* 检测目录不存在则创建
*/

protected function checkUploadPath(){
if(!file_exists($this->uploadPath)){
mkdir($this->uploadPath,0777,true);
}
}
/**
* 产生唯一字符串
* @return string
*/

protected function getUniName(){
return md5(uniqid(microtime(true),true));
}
/**
* 上传文件
* @return string
*/

public function uploadFile(){
if($this->checkError()&&$this->checkSize()&&$this->checkExt()&&$this->checkMime()&&$this->checkTrueImg()&&$this->checkHTTPPost()){
$this->checkUploadPath();
$this->uniName=$this->getUniName();
$this->destination=$this->uploadPath.'/'.$this->uniName.'.'.$this->ext;
if(@move_uploaded_file($this->fileInfo['tmp_name'], $this->destination)){
return $this->destination;
}else{
$this->error='文件移动失败';
$this->showError();
}
}else{
$this->showError();
}
}
}