php多文件上传的三种方法


PHP #多文件上传2012-10-29 17:23

今天一个网介绍三种多文件上传的方法,前两种都是直接遍历三维超全局数组$_FILES,最后一种是先定义一个单文件上传函数,再循环调用该函数,完成多文件的上传。

方法一:当多文件上传表单中多个上传文件的name属性为“pic[]”形式时,也即表单为这种形式。

HTML代码:

<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="">
<input type="file" name="pic[]" /><br><br>
<input type="file" name="pic[]" /><br><br>
<input type="file" name="pic[]" /><br><br>
<input type="file" name="pic[]" /><br><br>
<input type="submit" value="upload"/>
</form>
PHP代码:

<?php
//1.获取要上传文件的信息
$up_info=$_FILES['pic'];

$ob_path="../system";

$typelist=array("image/gif","image/jpeg","image/pjpeg","image/png"); //定义运行的上传文件类型


for($i=0;$i<count($up_info['name']);$i++){ //foreach 循环处理多个文件上传
	//2.判断文件是否上传错误

	if($up_info['error'][$i]>0){
		switch($up_info['error'][$i]){
			case 1:
				$err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";
				break;
			case 2:
				$err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";
				break;
			case 3:
				$err_info="文件只有部分被上传";
				break;
			case 4:
				$err_info="没有文件被上传";
				break;
			case 6:
				$err_info="找不到临时文件夹";
				break;
			case 7:
				$err_info="文件写入失败";
				break;
			default:
				$err_info="未知的上传错误";
				break;
		}
		continue($err_info);
	}


	//3.判断文件上传的类型是否合法

	if(!in_array($up_info['type'][$i],$typelist)){
		continue('文件类型错误!'.$up_info['type'][$i]);
	}

	//4.上传文件的大小过滤

	if($up_info['size'][$i]>1000000){
		continue('文件大小超过1000000');
	}


	//5.上传文件名处理

	$exten_name=pathinfo($up_info['name'][$i],PATHINFO_EXTENSION);

	do{
		$main_name=date('YmHis'.'--'.rand(100,999));
		$new_name=$main_name.'.'.$exten_name;
	}while(file_exists($to_path.'/'.$new_name));



	//6.判断是否是上传的文件,并执行上传

	if(is_uploaded_file($up_info['tmp_name'][$i])){

		if(move_uploaded_file($up_info['tmp_name'][$i],$ob_path.'/'.$new_name)){
			echo '文件上传成功!';
		}else{
			echo '上传文件移动失败!';
		}
	}else{
		echo '文件不是上传的文件';
	}

} //for循环的括号
方法二:当多文件上传表单中多个上传文件的name属性为“pic,text,doc,pdf”形式时

也即表单为这种形式:

<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="">
<input type="file" name="pic" /><br><br>
<input type="file" name="text" /><br><br>
<input type="file" name="doc" /><br><br>
<input type="file" name="pdf" /><br><br>

<input type="submit" value="upload"/>
</form>

//1.获取要上传文件的信息
$up_info=$_FILES;

$ob_path="..\system";

$typelist=array("image/gif","image/jpeg","image/pjpeg","image/png"); //定义运行的上传文件类型



foreach($up_info as $k_name=>$value){ //用foreach循环 处理多个文件的上传
	//2.判断文件是否上传错误

	if($up_info[$k_name]['error']>0){
		switch($up_info['error'][$i]){
			case 1:
				$err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";
				break;
			case 2:
				$err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";
				break;
			case 3:
				$err_info="文件只有部分被上传";
				break;
			case 4:
				$err_info="没有文件被上传";
				break;
			case 6:
				$err_info="找不到临时文件夹";
				break;
			case 7:
				$err_info="文件写入失败";
				break;
			default:
				$err_info="未知的上传错误";
				break;
		}
		continue($err_info);
	}


	//3.判断文件上传的类型是否合法

	if(!in_array($up_info[$k_name]['type'],$typelist)){
		continue('文件类型错误!'.$up_info[$k_name]['type']);
	}

	//4.上传文件的大小过滤

	if($up_info[$k_name]['size']>100000){
		echo '文件大小超过**';
		continue;
	}


	//5.上传文件名处理

	$exten_name=pathinfo($up_info[$k_name]['name'],PATHINFO_EXTENSION);

	do{
		$main_name=date('YmHis'.'--'.rand(100,999));
		$new_name=$main_name.'.'.$exten_name;
	}while(file_exists($to_path.'/'.$new_name));


	//6.判断是否是上传的文件,并执行上传

	if(is_uploaded_file($up_info[$k_name]['tmp_name'])){

		if(move_uploaded_file($up_info[$k_name]['tmp_name'],$ob_path.'/'.$new_name)){
			echo '文件上传成功!';
		}else{
			echo '上传文件移动失败!';
		}
	}else{
		echo '文件不是上传的文件';
	}

} //for循环的括号

方法三:先定义单个文件上传的函数,再循环调用这个函数,每次传入一个文件的上传信息,也可以到达多文件上传的目的,而且这种方式,更容易理解。

<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="">
<input type="file" name="pic1" ><br>
<input type="file" name="pic2"><br>
<input type="file" name="pic3"><br>
<input type="submit" value="upload">
</form>

/*
*单文件上传函数
*@param array $up_info 记录上传文件信息的超全局数组
*@param string $to_path 上传文件的目标路径
*@param array $typlist 允许的文件类型
*@param int $file_size允许的文件大小
*@return string 上传失败,返回失败的原因,
* http://yige.org/php/
* 成功返回包括文件名的路径。
*/


function upload_fun($up_info,$to_path,$typelist=array(),$file_size=2000000){

	//1.判断文件上传是否错误

	if($up_file['error']>0){
		switch($up_info['error']){
			case 1:
				$err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";
				break;
			case 2:
				$err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";
				break;
			case 3:
				$err_info="文件只有部分被上传";
				break;
			case 4:
				$err_info="没有文件被上传";
				break;
			case 6:
				$err_info="找不到临时文件夹";
				break;
			case 7:
				$err_info="文件写入失败";
				break;
			default:
				$err_info="未知的上传错误";
				break;
		}

		return $err_info;
		die();
	}


	//2.判断上传文件类型是否合法

	if(count($typelist)>0){
		if(!in_array($up_info['type'],$typelist)){

			$err_info='文件类型不合法!'.$up_info['type'];
			return $err_info;
			die();
		}
	}

	//4.判断上传文件大小是否超出允许值

	if($up_info['size']>$file_size){

		return $err_info='文件大小超过'.$file_size;
		die();
	}

	//5.上传文件重命名

	$exten_name=pathinfo($up_info['name'],PATHINFO_EXTENSION);

	do{
		$main_name=date('YmHis'.'--'.rand(100,999));
		$new_name=$main_name.'.'.$exten_name;
	}while(file_exists($to_path.'/'.$new_name));

	//6.判断是否是上传的文件,并移动文件

	if(is_uploaded_file($up_info['tmp_name'])){

		if(move_uploaded_file($up_info['tmp_name'],$to_path.'/'.$new_name)){

			$err_info=$to_path.'/'.$new_name;
			return $err_info;
			die();
		}else{

			return $err_info='上传文件移动失败!';
			die();

		}
	}else{

		return $err_info='这个文件不是上传文件!';
		die();
	}

}

//函数使用方法如下

$multi_info=$_FILES; //接收$_FILES的全部上传信息

$to_path='system'; //上传文件的目标路径

foreach($multi_info as $name=>$up_info){ //foreach 遍历$multi_info

	$err_info=upload_fun($up_info,$to_path); //调用单文件上传函数

	p($err_info); //输出返回信息;

}


相关文章

粤ICP备11097351号-1