超级文件,目录处理类(上传文件)
前段时间项目用到上传功能,可别人的上传类,用得很不爽,所以就自己动手写了个,大家可看看。好了,回归正题:
?
该上传类,支持目录的操作,多文件上传..功能;
?
File.class.php代码:
<?php/** * 文件的操作类; * @author lansexin */class File {var $allow_type;//允许的上传文件类型;var $moveto;//上传文件的地址;var $maxsize;//文件的最大大小;var $rand;//是否随机产生文件名 ;function __construct($arr){if(!empty($arr)){$type=explode(',',$arr['type']);$this->allow_type=(is_array($type)&&$arr['type'])?$type:array('txt','gif','png','jpg');//默认的类型;$this->moveto=$arr['moveto'];//上传的目录;$this->maxsize=$arr['size']?$arr['size']:(1024*1024*2);//上传的大小限制;$this->rand=$arr['rand']?true:false;//是否随机产生文件名 ;}}/** * 获取目录下的所有目录和文件; * $dir 要遍历的目录; */ function getMenu($dir) {$menu = opendir ( $dir );$farr = array ();while ( $fileName = readdir ( $menu ) ) { //遍历读取目录,读取完后指针后移一个;$file = $dir . "/" . $fileName;if ($fileName != '.' && $fileName != '..') {if (is_dir ( $file )) {$tmp=$this->getMenu($file);$farr ['menu'] [$fileName] = $tmp;} else {$farr [$dir] [] = $fileName; //不同目录下的文件;}}}closedir ( $menu );return $farr;}/** * 获取文件,目录的大小,创建时间... * @param resource $file */ function getInfo($file) {if (! file_exists ( $file ))return null;if (is_file ( $file )) { //文件;$f ['size'] = $this->tosize( filesize ( $file ) );} else if (is_dir ( $file )) { //目录$f ['size'] = $this->tosize($this->dirsize ( $file ));}$f ['ctime'] = date ( 'Y-m-d H:i:s', filectime ( $file ) );$f ['mtime'] = date ( 'Y-m-d H:i:s', filemtime ( $file ) );$f ['type'] = filetype ( $file );return $f;}/** * 复制目录 * @param dir $dir */function copydir($dir,$dirto){if(is_file($dirto)){echo "不是目录不能复制";return ;}if(!file_exists($dirto)){mkdir($dirto);}$menu=opendir($dir);while ( $filename = readdir ( $menu ) ) { //遍历读取目录,读取完后指针后移一个;if ($filename != '.' && $filename != '..') {$f1=$dir.'/'.$filename;$f2=$dirto.'/'.$filename;if (is_dir ( $f1 )) {$this->copydir($f1,$f2);}else{copy($f1,$f2);}}}closedir($menu);}/** * 获取目录的大小; * @param dir $dir */ function dirsize($dirname) {$dirsize = 0;$dir = opendir ( $dirname );while ( $filename = readdir ( $dir ) ) {$file = $dirname . "/" . $filename;if ($filename == "." || $filename == "..") {continue;}if (is_dir ( $file )) {$dirsize += $this->dirsize ( $file ); //递归完成} else {$dirsize += filesize ( $file );}}closedir ( $dir );return $dirsize;}/** * 遍历删除目录; */function deldir($dir){if(file_exists($dir)){$f=opendir($dir);while($filename=readdir($f)){if ($filename != '.' && $filename != '..') {$file=$dir."/".$filename;if(is_dir($file)){$this->deldir($file);}else{unlink($file);}}}closedir($f);rmdir($dir);}else{return false;}return true;}/** * 文件大小转换函数 * @param int $size */ function tosize($size) {if ($size >= pow ( 2, 40 )) {return round ( $size / pow ( 2, 40 ), 2 ) . "TB";} elseif ($size >= pow ( 2, 30 )) {return round ( $size / pow ( 2, 30 ), 2 ) . "GB";} elseif ($size >= pow ( 2, 20 )) {return round ( $size / pow ( 2, 20 ), 2 ) . "MB";} elseif ($size >= pow ( 2, 10 )) {return round ( $size / pow ( 2, 10 ), 2 ) . "KB";} else {return round ( $size, 2 ) . "Byte";}}/**-------------------------------------------------- * ************************************************** * *****************文件上传相关内容********************** * ************************************************* *--------------------------------------------------*//** * 上传文件的错误信息; * Enter $no 错误数字; */private function msg($no){$msg="";switch ($no){case 0:$msg='success';break;case 1:$msg='文件超出了限制的上传大小';break;case 2:$msg='上传文件的大小超过了 HTML表单中 MAX_FILE_SIZE 最多值';break;case 3:$msg='文件只有部分上传';break;case 4:$msg='没有文件被上传';break;default:$msg='文件上传失败';break;}return $msg;}/** * 文件上傳; */function upload(){$files=$_FILES;if(!empty($files)){$inputs=array_keys($files);foreach($inputs as $inp){if(!empty($files[$inp])){$this->toup($files[$inp]);}}}else{echo "沒有文件要上傳"."<br>";}}/** * 处理不同情况下的文件处理上传; * @param array $tmp */private function toup($tmp){$cout=count($tmp['name']);if($cout>1){//多個文件;for($i=0;$i<$cout;$i++){$name=$tmp['name'][$i];$err=$tmp['error'][$i];$size=$tmp['size'][$i];$tmp_name=$tmp['tmp_name'][$i];$this->up($name,$err,$size,$tmp_name);//判断,并上传;}}else{$name=$tmp['name'];$err=$tmp['error'];$size=$tmp['size'];$tmp_name=$tmp['tmp_name'];$this->up($name,$err,$size,$tmp_name);//判断,并上传;}}/** * 真正的上传处理方法; * @param string $name * @param string $err * @param int $size * @param string $tmp_name */private function up($name,$err,$size,$tmp_name){$msg=$this->msg($err);if($msg!="success"){echo $name." ".$msg."<br>";return ;}$name_str="<font color='red'>".$name."</font>";$boo=$this->is_allow('type',$name);if($boo==true){//判断类型;$tt=$this->is_allow('size',$size);if($tt){//判断大小;if(is_uploaded_file($tmp_name)){$ext=explode('.',$name);$ext=$ext[count($ext)-1];$filepath=$this->moveto;if(!is_dir($filepath)){//如果上传的目录不存在,则自动创建;mkdir($filepath);}if($this->rand){//是否用随机文件名;$randname=date('YmdHis').rand(100,999).".".$ext;}else{$randname=iconv('gb2312','utf-8',$name);}if(move_uploaded_file($tmp_name, $filepath."/".$randname)){echo "文件名:".$name_str."<br>";echo "大 小:".$this->tosize($size)."<br>";echo "类 型:".$ext."<br>";echo "状 态:上传成功"."<br><br>";}else{echo $name_str." 上传失败"."<br>";}}else{echo $name_str." 不是一个上传文件"."<br>";}}else{echo $name_str." 文件太大,不能上传"."<br>";}}else{echo $name_str." 这种文件不允许上传"."<br>";}}/** * 判断是否满足上传的条件; * @param $type 类型 * @param $vals 值 */private function is_allow($type,$vals){$boo=false;if($type=="type"){//判斷類型;$ext=explode('.',$vals);$ext=strtolower($ext[count($ext)-1]);if(in_array($ext,$this->allow_type)){$boo=true;}}else if($type=="size"){//判斷文件大小;if($vals<=$this->maxsize){$boo=true;}}return $boo;}/** * 文件下载; */function down($file){header('Content-type:'.filetype($file));header('Content-Disposition: attachment; filename="'.$file.'"');header("'Content-length:".filesize($file));}}?
文件上传使用:
<?phpif($_FILES){include_once 'Files.class.php';$cfg=array('moveto'=>'./upload','size'=>1024*1024*2,'type'=>'txt,png,gif,jpg','rand'=>true,);$f = new File($cfg);$f->upload();}else{?><html><head><title>文件上传</title></head><body><form action="?" method="post" enctype="multipart/form-data">文 件1:<input type="file" name="file[]"><br/>文 件2:<input type="file" name="file[]"><br/><input type="submit" value="上传" /></form></body></html><?php } ?>?
这样就可以很轻松的完成文件的上传。更多功能,可以自己研究
?
1 楼 sogo6 2011-09-21 不错。。。。。