一个非常实用的php文件上传类
其实网上已经有很多这样的类了,不过出于练手的目的还是自己仿照着写了一个。
下面的代码放在一个名为UploadFile.class.php文件内
rand_name=$rand_name;
$this->save_path=$save_path;
$this->allow_type=$this->get_allow_type($allow_type);
}
/**
*上传文件
*在上传文件前要做的工作
*(1)获取文件所有信息
*(2)判断上传文件是否合法
*(3)设置文件存放路径
*(4)是否重命名
*(5)上传完成
*@paramarray$file上传文件
*$file须包含$file['name'],$file['size'],$file['error'],$file['tmp_name']
*/
publicfunctionupload_file($file){
//$this->file=$file;
$this->file_name=$file['name'];
$this->file_size=$file['size'];
$this->error=$file['error'];
$this->file_tmp_name=$file['tmp_name'];
$this->ext=$this->get_file_type($this->file_name);
switch($this->error){
case0:$this->msg='';break;
case1:$this->msg='超出了php.ini中文件大小';break;
case2:$this->msg='超出了MAX_FILE_SIZE的文件大小';break;
case3:$this->msg='文件被部分上传';break;
case4:$this->msg='没有文件上传';break;
case5:$this->msg='文件大小为0';break;
default:$this->msg='上传失败';break;
}
if($this->error==0&&is_uploaded_file($this->file_tmp_name)){
//检测文件类型
if(in_array($this->ext,$this->allow_type)==false){
$this->msg='文件类型不正确';
returnfalse;
}
//检测文件大小
if($this->file_size>$this->max_size){
$this->msg='文件过大';
returnfalse;
}
}
$this->set_file_name();
$this->uploaded=$this->save_path.$this->new_name;
if(move_uploaded_file($this->file_tmp_name,$this->uploaded)){
$this->msg='文件上传成功';
returntrue;
}else{
$this->msg='文件上传失败';
returnfalse;
}
}
/**
*设置上传后的文件名
*当前的毫秒数和原扩展名为新文件名
*/
publicfunctionset_file_name(){
if($this->rand_name==true){
$a=explode('',microtime());
$t=$a[1].($a[0]*1000000);
$this->new_name=$t.'.'.($this->ext);
}else{
$this->new_name=$this->file_name;
}
}
/**
*获取上传文件类型
*@paramstring$filename目标文件
*@returnstring$ext文件类型
*/
publicfunctionget_file_type($filename){
$ext=pathinfo($filename,PATHINFO_EXTENSION);
return$ext;
}
/**
*获取可上传文件的类型
*/
publicfunctionget_allow_type($allow_type){
$s=array();
if(is_array($allow_type)){
foreach($allow_typeas$value){
$s[]=$value;
}
}else{
$s=preg_split("/[\s,|;]+/",$allow_type);
}
return$s;
}
//获取错误信息
publicfunctionget_msg(){
return$this->msg;
}
}
?>
其实上面的代码中还有一个可以改进的地方,就是将那些以‘file_'开头的变量缩写为一个$file数组,这样感觉更好一些。
下面我们来测试一下上面的代码。我在一个名为upfile.php文件写测试代码,同时将UploadFile.class.php放在同一个路径下。
upfile 0){ echo"Error:".$_FILES["file"]["error"]."
"; }else{ $file=$_FILES['file']; $upload=newUploadFile(true,'./images/',array('jpg','jpeg','png')); $upload->upload_file($file); echo$upload->get_msg(); } }else{ ?>
在上面的代码中,我们可以尝试修改第15行的参数,用来判断一下我们写的方法是否正确。
这3个参数的含义分别表示:是否使用系统命名、文件存放的路径(相对)、允许上传的文件类型。那么就试试修改这3个参数会发生什么样的变化:(1)把true改为false是否就可以使用它原来的名字了;(2)改下存放路径,看看能不能依然能够上传;(3)试试上传几个不允许的文件,看能不能禁止住,而且关键第三个参数有两种形式,一种是数组,就像示例中一样;还有一种是字符串,用分隔符隔开就行,'jpg|jpeg|png|gif','jpgjpegpnggif','jpg,jpeg,png,gif'都行。
好的,文件上传类就这样写好了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。