有时候项目中经常有一次上传多个文件的的需要,在网上找了一下,没有找到很方便的,于是写了一个,最能适合这种上次上传多个文件的情况了
当然对上传单个文件就更不用说了,希望大家能喜欢!!
复制内容到剪贴板
代码:
/*
@名称:UPLOAD_CLASS
@功能:上传文件,可以是单个文件式或数组式
@作者:袁维
@版本:V1.0
@时间:2006-12-3
*/
class UPLOAD_CLASS
{
var $fexts='*'; //允许上传的文件扩展名集合,"*":表示任何文件;格式为:".jpg|.swf|.png"
var $max_size=0; //允许的最大文件大小,单位以K. 0:表示任何大小
var $is_del=false; //当目标文件存在时是否删除
var $uploaded_file=''; //已上传成功的文件名,多个用","隔开
var $input_name; //FILE控件名称
/* 功能:构造函数
参数:$input_name:表单中FILE控件名称,如 中的"upfile"
也可以控件是数组,如
*/
function UPLOAD_CLASS($input_name='')
{
if($input_name == '')
{
echo 'UPLOAD_CLASS类构造出错:请指定表单中FILE控件的名称!如: $up = new UPLOAD_CLASS("up_file");';
}
$this->input_name = $input_name;
}
/* 设置最大上传的文件大小 */
function set_size($max_size)
{
$this->max_size = $max_size * 1024;
}
/* 设置上传文件的扩展名集合 */
function set_fexts($exts)
{
$this->fexts = $exts;
}
/* 设置目标文件存在时是否删除 */
function set_del($bool)
{
$this->is_del = $bool;
}
/* 功能:上传文件操作
参数:$dst_file:上传后的目标文件名,如果没有加扩展名则上传时自动加上原文件扩展名.
如果FILE控件是数组,则 $dst_file 为目标文件个数与上传的文件数匹配的数组,如下:
array('./img/a.jpg','./img/b.jpg') 也可为 array('./img/a','./img/b')
返回值: [-1]成功 [0]:没有上传的文件 [1]:文件超过大小 [2]:不是指定的类型
[3]:目标文件已存在 [4]:目标文件不能写入 [5]:目标文件个数与上传的文件数不匹配
*/
function upload($dst_file)
{
$ay = $_FILES[$this->input_name]['name'];
if(is_array($ay)) //表单中的FILE控件是数组
{
if( !is_array($dst_file) || count($ay) != count($dst_file) ) return 5;
$tmp_ay = array(); //临时数组保存暂时已上传成功的文件名,用于所有文件没有完全上传成功的情况删除它们
$ret = -1;
foreach($ay as $key=>$val)
{
$file_name = $_FILES[$this->input_name]['name'][$key]; //上传的原文件名
$file_size = $_FILES[$this->input_name]['size'][$key]; //上传后的临时文件名
$tmp_file = $_FILES[$this->input_name]['tmp_name'][$key];//文件大小
if($file_name != '') //该控件上传了文件
{
$ret = $this->_upload($file_name,$tmp_file,$file_size,$dst_file[$key]);
if( $ret != -1 ) //如果文件没有上传成功,就要删除已经上传的文件
{
for($i=0; $i<COUNT($TMP_AY); @unlink($tmp_ay[$i]);
break;
}
$tmp_ay[]=$dst_file[$key];
}
}//End Foreach
return $ret;
}else{
//---上传单个文件上传
$file_name = $_FILES[$this->input_name]['name']; //上传的原文件名
$tmp_file = $_FILES[$this->input_name]['tmp_name'];//上传后的临时文件名
$file_size = $_FILES[$this->input_name]['size']; //文件大小
return $this->_upload($file_name,$tmp_file,$file_size,$dst_file);
}
}
/* 功能:得到已上传成功的文件名,多个用","隔开
参数: $flg [0]:文件名有完整的路径 [1]:文件名不带路径
*/
function uploaded_files($flg=0)
{
$files = '';
if( $flg == 0 )
{
$files = $this->uploaded_file;
}else{
$ay=explode(',',$this->uploaded_file);
for($i=0; $i<COUNT($AY); $i++)
{
if( $files == '' )
{
$files = basename($ay[$i]);
}else{
$files .= ','.basename($ay[$i]);
}
}
}
return $files;
}
/* 得到上传的信息,如果FILE控件是个数组,则返回的是个二维数组,否则返回是一级数组 */
function &uploadInfo()
{
$ay=array();
if(!is_array($_FILES[$input_name]['name']))
{
$ay['name'] = $_FILES[$this->input_name]['name'];
$ay['ext'] = strtolower(strrchr($ay['name'],'.'));
$ay['type'] = $_FILES[$this->input_name]['type'];
$ay['size'] = $_FILES[$this->input_name]['size'];
$ay['tmp_name'] = $_FILES[$this->input_name]['tmp_name'];
}else{
foreach($_FILES[$input_name]['name'] as $i=>$val)
{
$ay[$i]['name'] = $_FILES[$this->input_name]['name'][$i];
$ay[$i]['ext'] = strtolower(strrchr($ay[$i]['name'],'.'));
$ay[$i]['type'] = $_FILES[$this->input_name]['type'][$i];
$ay[$i]['size'] = $_FILES[$this->input_name]['size'][$i];
$ay[$i]['tmp_name'] = $_FILES[$this->input_name]['tmp_name'][$i];
}
}//End If
return $ay;
}
/* 功能: 得到上传的状态,数组包含 总的上传个数 和 真实文件个数(FILE控件数组中选择的文件数)
返回: $ay['sum']:总的上传个数 $ay['up']:真实文件个数
*/
function &upload_state()
{
$ay=array('sum'=>0,'up'=>0);
if(!is_array($_FILES[$this->input_name]['name']))
{
$ay['sum']++;
if( $_FILES[$this->input_name]['name'] != '' ) $ay['up']++;
}else{
foreach($_FILES[$this->input_name]['name'] as $i=>$val)
{
$ay['sum']++;
if( $_FILES[$this->input_name]['name'][$i] != '' ) $ay['up']++;
}
}//End If
return $ay;
}
/* 得到小写的文件扩展名,如".php" */
function file_ext($file_name)
{
return strtolower(strrchr($file_name,"."));
}
/* -私有成员函数,不直接调用- */
function _upload($file_name,$tmp_file,$file_size,$dst_file)
{
$ext = $this->file_ext($file_name); //得到原文件扩展名
$dst_file = str_replace("\\",'/',$dst_file); //兼容windows
if( $tmp_file=='' || $file_size< 1 || !is_uploaded_file($tmp_file) )//没有上传的文件
{
return 0;
}
if( $this->max_size != 0 ) //限制了上传文件的大小
{
if($file_size > $this->max_size) //文件大小超过了限制
{
return 1;
}
}
if( $this->fexts != "*") //限制了上传文件的类型
{
if( strstr($this->fexts,$ext) == '' )//不是指定的文件类型
{
return 2;
}
}
if( $dst_file[strlen($dst_file)-1] == '/' ) //没有目标文件名,如"./file/"
{
return 4;
}
//---从最后的"/"处得到文件名,已更准确的判断目标文件是否加了扩展名
if( strrchr($dst_file,"/") != '' ) //如果目标文件是这种形式:"./file_dir/picfile"
{
$tmp_file_name=strrchr($dst_file,"/"); //得到如"/picfile"
}else{
$tmp_file_name=$dst_file;
}
if( strrchr($tmp_file_name,".") == '') //目标文件没有加扩展名就加上原文件扩展名
{
$dst_file .= $ext;
}
//---如果目标文件存在判断是否删除它
if(file_exists($dst_file))
{
if($this->is_del)
{
@unlink($dst_file);
}else{
return 3;
}
}
//---复制上传的文件到目标文件
if(@copy($tmp_file,$dst_file))
{
@chmod($dst_file,0777);
}else{
return 4;
}
@unlink($tmp_file);
if( $this->uploaded_file == '' ) //文件上传成功就记录文件
{
$this->uploaded_file = $dst_file;
}else{
$this->uploaded_file .= ','.$dst_file;
}
return -1;
}
}//End Class
/* -----------表单中FILE控件是数组,多文件上传的调用例子如下--------------------------------*/
$upload = new UPLOAD_CLASS('pic_file'); //FILE控件的名称,这里是数组
$upload->set_fexts('.jpg|.jpeg|.gif|.png');
$upload->set_size(200); //KB
$up_ay = $upload->upload_state(); //得到上传的状态,以更好的进行上传操作
if( $up_ay['up'] > 0 ) //如果用户上传了相片
{
for($i=0; $i<$up_ay['sum']; $i++) //生成对应的目标文件
{
$dst_file[] = get_rnd_filename(); //随机文件名,不含扩展名,因为UPLOAD_CLASS类可以自己加上上传文件的扩展名
}
$val = $upload->upload($dst_file);
switch($val)
{
case 1:
$msg='你上传的照片太大了,';
break;
case 2:
$msg='你上传的照片不是指定的类型,';
break;
default:
$msg='你上传的照片不合法,';
break;
}
}
/*------------单个文件上传调用例子如下----------------------------------*/
$upload = new UPLOAD_CLASS('pic_file');//FILE控件的名称
$upload->set_fexts('.jpg|.jpeg|.gif|.png');
$upload->set_size(200); //KB
$up_ay = $upload->upload_state(); //得到上传的状态,以更好的进行上传操作
if( $up_ay['up'] > 0 ) //如果用户上传了相片
{
$dst_file = get_rnd_filename(); //随机文件名,不含扩展名,因为UPLOAD_CLASS类可以自己加上上传文件的扩展名
$val = $upload->upload($dst_file);
switch($val)
{
case 1:
$msg='你上传的照片太大了,';
break;
case 2:
$msg='你上传的照片不是指定的类型,';
break;
default:
$msg='你上传的照片不合法,';
break;
}
}