支持自定義文件上傳、支持擴展多文件上傳功能。代碼如下
<code>
<?
/**
* filename:upload.class.php
* since:2006-11-28
* description:文件上傳類。
* author feifengxlq<許立強> http://www.phpobject.net/blog
* version v0.02
* demo:
$upload=new upload(array('path'=>'../test','allow_type'=>array('txt')));
print_r($upload->upfile('userfile'));
自定義上傳文件名
$upload=new upload();
print_r($upload->upfile('userfile',array('allow_type'=>array('txt'),'filename'=>'test.txt')));
*/
class upload
{
var $path='/uploadfiles/';//上傳文件的路徑
var $allow_type=array('jpg','gif');//允許上傳的文件類型
var $max_size='2048';//允許的最大文件大小
//var $field='uploadfile';//上傳文件的字段名
var $overwrite=false;//是否設置成覆蓋模式
var $renamed=true;//是否直接使用上傳文件的名稱,還是系統自動命名
//private
var $upfile=array();//上傳後文件信息
var $ext='';//上傳文件的擴展名
var $errormsg='';//出錯信息
var $filename='';//是否設置了上傳後的文件名
/**
* 出錯模式
* 0:出錯就exit
* 1:出錯返回出錯信息
*/
var $error_mode=0;//出錯模式
function upload($options=array())
{
//構造
$this->_set_options($options);
}
//上傳文件
function upfile($field,$options=array())
{
//設置上傳文件的屬性
$this->_set_options($options);
//獲取文件
$this->_set_upfile($field);
//檢查文件
$this->_check();
//設置上傳後的文件名
$this->_set_filename();
//檢查是否出錯
if($this->errormsg)return false;
//上傳文件
if(@move_uploaded_file($this->upfile['tmp_name'],$this->upfile['filename']))return $this->upfile;
//上傳失敗
$this->error(__FUNCTION__.'():'.$this->upfile['filename'].'上傳失敗。');
return false;
}
//獲取出錯信息
function get_error()
{
if($this->errormsg)return $this->errormsg;
return false;
}
/**-----------private-----------------------------------------------*/
/**
* 設置上傳後的文件名
*/
function _set_filename()
{
//是否重命名
if($this->filename){
//如果用戶設置了文件名
if(file_exists($this->filename))@unlink($this->filename);
$this->upfile['filename']=$this->filename;
return true;
}
//檢查上傳文件路徑
if(!file_exists($this->path))$this->_mkpath($this->path);
if($this->path[strlen($this->path)-1]!='/')$this->path.='/';//
if($this->renamed){
$ext=$this->ext;
if(empty($ext))$ext=$this->_get_ext($this->upfile['name']);
$filename=uniqid(time()).'.'.$ext;
}else{
$filename=$this->upfile['name'];
}
//是否覆蓋模式
if(!$this->overwrite){
//不覆蓋,檢查是否存在同名文件
$i=1;
while(file_exists($this->path.$filename)){
$filename=$i.'_'.$filename;
$i++;
}
}else{
//覆蓋模式,如果存在改文件,則刪除
if(file_exists($this->path.$filename))@unlink($this->path.$filename);
}
$this->upfile['filename']=$this->path.$filename;
}
/**
* 檢查文件是否符合需要
*/
function _check()
{
//檢查文件大小
$this->_check_size();
//檢查文件類型
$this->_check_type();
}
/**
* 設置屬性
*/
function _set_options($options){
if(is_array($options)){
foreach($options as $key=>$value){
if(in_array($key,array('path','allow_type','max_size','overwrite','renamed','error_mode','filename'))){
$this->_set($key,$value);
}
}
}
}
/**
* 檢查文件類型getimagesize
*/
function _check_type()
{
$this->_get_ext($this->upfile['name']);
$this->upfile['filetype']=$this->ext;
if(in_array($this->ext,$this->allow_type))
{
//檢查mine類型
$file_mine=$this->upfile['type'];
if(empty($file_mine))return true;
//檢查mine類型是否符合
$this->_check_mine($file_mine);
}else{
$this->error(__FUNCTION__.'():'.$this->upfile['name'].'文件類型'.$this->ext.'不符合。只允許上傳'.implode(',',$this->allow_type));
}
}
/**
* 檢查上傳文件的mine類型
*/
function _check_mine($mine)
{
require_once('filetype.php');
$pass=false;
foreach($this->allow_type as $type){
if(is_array($filetype[$type])){
if(in_array($mine,$filetype[$type])){
//
$pass=true;
break;
}
}elseif($filetype[$type]==$mine){
$pass=true;
break;
}
}
if(!$pass)$this->error(__FUNCTION__.'():'.$this->upfile['name'].'文件mine類型不符合。只允許上傳'.implode(',',$this->allow_type));
}
/**
* 獲取文件的後綴
*/
function _get_ext($file){
$ext = explode(".", $file);
$ext = $ext[count($ext) - 1];
$this->ext=strtolower($ext);
return $this->ext;
}
/**
* 檢查文件大小
*/
function _check_size()
{
if($this->upfile['size']>$this->max_size*1024)
$this->error(__FUNCTION__.'():'.$this->upfile['name'].'文件大小超過了限制'.$this->max_size.'MB');
}
/**
* 獲取文件
* @param field
* @return
*/
function _set_upfile($field)
{
if(!$_FILES[$field])$this->error(__FUNCTION__.'():文件不存在!');
if($_FILES[$field]['error']>=1)$this->error(__FUNCTION__.'():'.$this->_get_upload_error($_FILES[$field]['error']));
$this->upfile=$_FILES[$field];
}
function _set($key,$value){
$this->$key=$value;
}
/**
* 構造目錄
*/
function _mkpath($path,$mode=700){
$path=str_replace("//","/",$path);
$path_info=explode('/',$path);
$total=count($path_info);
$path='';
for($i=0;$i<$total;$i++)
{
$path.=$path_info[$i].'/';
if(empty($path_info[$i]))continue;
if(file_exists($path))
{
continue;
}else{
if(!@mkdir($path,$mode))$this->error(__FUNCTION__.'(),創建'.$path.'出錯!');
}
}
return true;
}
/**
* 格式化文件大小
*/
function format_size($size)
{
if($size<1024){
return $size.'B';
}elseif ($size<1024*1024){
return number_format((double)($size/1024),2).'KB';
}else{
return number_format((double)($size/(1024*1024)),2).'MB';
}
}
/**
* 獲取上傳出錯信息(根據$_FILES['file']['error]])
*/
function _get_upload_error($id)
{
switch($id)
{
case 1:
return '上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值';
case 2:
return '上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值';
case 3:
return '文件只有部分被上傳';
case 4:
return '沒有文件被上傳';
case 5:
return '未知錯誤!';
case 6:
return '找不到臨時文件夾';
case 7:
return '文件寫入失敗';
default:
return '未知錯誤!';
}
}
/**
* 出錯處理!
*/
function error($msg)
{
if($this->error_mode==0)die('ERROR : file '.__FILE__.' function '.$msg);
$this->errormsg.='ERROR : file '.__FILE__.' function '.$msg."/n";
}
}
?>[/code2]
其中幾個簡單的調用demo
[code2]<?
$upload=new upload(array('path'=>'../test','allow_type'=>array('txt')));
print_r($upload->upfile('userfile'));
自定義上傳文件名
$upload=new upload();
print_r($upload->upfile('userfile',array('allow_type'=>array('txt'),'filename'=>'test.txt')));
?> [/code2]
另外其中有個filetype.php文件
常用文件得mine類型。
<?
$filetype=array();
$filetype['hqx']="application/mac-binhex40";
$filetype['bin']="application/octet-stream";
$filetype['oda']="application/oda";
$filetype['pdf']="application/pdf";
$filetype['ai']="application/postsrcipt";
$filetype['eps']="application/postsrcipt";
$filetype['es']="application/postsrcipt";
$filetype['rtf']="application/rtf";
$filetype['mif']="application/x-mif";
$filetype['csh']="application/x-csh";
$filetype['dvi']="application/x-dvi";
$filetype['hdf']="application/x-hdf";
$filetype['nc']="application/x-netcdf";
$filetype['cdf']="application/x-netcdf";
$filetype['latex']="application/x-latex";
$filetype['ts']="application/x-troll-ts";
$filetype['src']="application/x-wais-source";
$filetype['zip']="application/zip";
$filetype['bcpio']="application/x-bcpio";
$filetype['cpio']="application/x-cpio";
$filetype['gtar']="application/x-gtar";
$filetype['shar']="application/x-shar";
$filetype['sv4cpio']="application/x-sv4cpio";
$filetype['sv4crc']="application/x-sv4crc";
$filetype['tar']="application/x-tar";
$filetype['ustar']="application/x-ustar";
$filetype['man']="application/x-troff-man";
$filetype['sh']="application/x-sh";
$filetype['tcl']="application/x-tcl";
$filetype['tex']="application/x-tex";
$filetype['texi']="application/x-texinfo";
$filetype['texinfo']="application/x-texinfo";
$filetype['t']="application/x-troff";
$filetype['tr']="application/x-troff";
$filetype['roff']="application/x-troff";
$filetype['shar']="application/x-shar";
$filetype['me']="application/x-troll-me";
$filetype['ts']="application/x-troll-ts";
$filetype['gif']="image/gif";
$filetype['jpeg']="image/pjpeg";
$filetype['jpg']=array("image/pjpeg","image/jpeg");
$filetype['jpe']="image/pjpeg";
$filetype['ras']="image/x-cmu-raster";
$filetype['pbm']="image/x-portable-bitmap";
$filetype['ppm']="image/x-portable-pixmap";
$filetype['xbm']="image/x-xbitmap";
$filetype['xwd']="image/x-xwindowdump";
$filetype['ief']="image/ief";
$filetype['tif']="image/tiff";
$filetype['tiff']="image/tiff";
$filetype['pnm']="image/x-portable-anymap";
$filetype['pgm']="image/x-portable-graymap";
$filetype['rgb']="image/x-rgb";
$filetype['xpm']="image/x-xpixmap";
$filetype['txt']="text/plain";
$filetype['c']="text/plain";
$filetype['cc']="text/plain";
$filetype['h']="text/plain";
$filetype['html']="text/html";
$filetype['htm']="text/html";
$filetype['htl']="text/html";
$filetype['rtx']="text/richtext";
$filetype['etx']="text/x-setext";
$filetype['tsv']="text/tab-separated-values";
$filetype['mpeg']="video/mpeg";
$filetype['avi']="video/avi";
$filetype['rm']="video/rm";
$filetype['rmvb']="video/rmvb";
$filetype['wmv']="video/x-ms-wmv";
$filetype['flv']="application/octet-stream";
$filetype['mpg']="video/mpeg";
$filetype['mpe']="video/mpeg";
$filetype['avi']="video/x-msvideo";
$filetype['qt']="video/quicktime";
$filetype['mov']="video/quicktime";
$filetype['moov']="video/quicktime";
$filetype['movie']="video/x-sgi-movie";
$filetype['au']="audio/basic";
$filetype['mp3']="audio/mp3";
$filetype['snd']="audio/basic";
$filetype['wav']="audio/wav";
$filetype['wma']="audio/x-ms-wma";
$filetype['aif']="audio/x-aiff";
$filetype['aiff']="audio/x-aiff";
$filetype['aifc']="audio/x-aiff";
$filetype['swf']="application/x-shockwave-flash";
$filetype['doc']="application/msword";
$filetype['ini']='application/octet-stream';
?>
</code>