欢迎投稿

今日深度:

PHP实现多文件上传,

PHP实现多文件上传,


PHP实现多文件上传,与单文件上传绝大部分是相同的,不过还是有区分的地方,主要有三点:


一、前端页面:

可以出现多个文件浏览按钮,也可以设置文件浏览按钮可以选择多个文件。需要注意的是文件浏览按钮的名字是数组,因为要求上传多个文件。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>上传文件</h2>
	<form action="testFiles.php" method='post' enctype="multipart/form-data">
		<!--<input type='file' name="myfile[]"/><br/>
		<input type='file' name="myfile[]"/><br/>
		<input type='file' name="myfile[]"/><br/>-->
		<input type='file' name="myfile[]" multiple="multiple"/><br/>
		<input type='submit' value="上传文件"/>
	</form>
</body>
</html>


二、如果上传的是多个文件,通过$_FILES获得的数组是三维数组;如果上传的是单个文件,通过$_FILES获得的数组是二维数组,所以这都需要判断,并且为了使用通过检测的图片文件成功上传,需要重构上传文件的信息。

其中getFiles()为上传文件信息的重构函数封装;uploadFile()为上传文件的检测函数封装,具体代码如下:


<span ><?php
	//构造上传文件信息
	function getFiles(){
		$i = 0;
		foreach($_FILES as $file){
			//如果上传的是单文件的话,直接把数组赋值就可以
			if(is_string($file['name'])){
				$files[$i] = $file;
				$i++;//循环变量自增
			}elseif(is_array($file['name'])){
				//如果上传的是多文件的话,需要从不同的数组中提取相对应的元素
				foreach($file['name'] as $key=>$var){
					$files[$i]['name'] = $file['name'][$key];
					$files[$i]['type'] = $file['type'][$key];
					$files[$i]['tmp_name'] = $file['tmp_name'][$key];
					$files[$i]['error'] = $file['error'][$key];
					$files[$i]['size'] = $file['size'][$key];
					$i++;//循环变量自增
				}
			}
		}
		return $files;
	}
	
	function uploadFile($pic_info){
	
		//判断是否上传头像
		if(!empty($pic_info)){	

	//判断文件上传到临时文件是否出错
	if($pic_info['error'] >0){
		$error_msg = '上传错误:';
		switch($pic_info['error']){
			case 1: $error_msg .= '文件大小超过了php.ini中upload_max_filesize选项限制的值!'; break;
			case 2: $error_msg .= '文件大小超过了表单中max_file_size选项指定的值!'; break;
			case 3: $error_msg .= '文件只有部分被上传!'; break;
			case 4: $error_msg .= '没有文件被上传!'; break;
			case 6: $error_msg .= '找不到临时文件夹!'; break;
			case 7: $error_msg .= '文件写入失败!'; break;
			case 8: $error_msg .= '由于PHP的扩展程序中断文件上传!'; break;
			default: $error_msg .='未知错误!'; break; 
		}
		echo $error_msg;
		return false;
	}
	
	//获取上传文件的类型,两种方法
	//$type = substr(strrchr($pic_info['name'],'.'),1);
	$type = pathinfo($pic_info['name'],PATHINFO_EXTENSION);
	$allow = array('jpeg','jpg','png','gif');
	//判断上传文件类型
	if(!in_array($type,$allow)){
		echo '图像类型不符合要求<br/>';
		return false;
	}
	
	//检测上传文件大小是否符合大小
	$maxSize = 2097152;   //2M
	if($pic_info['size']>$maxSize){
		exit('上传文件过大<br/>');
	}
	
	//检测文件是否是通过HTTP POST方式上传的
	if(!is_uploaded_file($pic_info['tmp_name'])){
		exit('文件还是通过HTTP POST方式上传的。<br/>');
	}
	
	//检测上传文件是否为真实的图片类型
	if(!getimagesize($pic_info['tmp_name'])){
		exit('不是一个真实的图片类型。<br/>');
	}
	
	//为上传文件起唯一的名字,确保不被覆盖
	//$new_file = $pic_info['id'].'.jpg';
	$unique = md5(uniqid(microtime(true),true)).'.'.$type;
	//如果指定目录不存在,则创建目录
	$uploadPath = 'upload';
	if(!file_exists($uploadPath)){
		mkdir($uploadPath,0777,true);
		chmod($uploadPath,0777);
	}
	$destination = $uploadPath.'/'.$unique;
	
	//从暂存目录上传到指定目录,@屏蔽错误信息
	if(!@move_uploaded_file($pic_info['tmp_name'],$destination)){
		exit('文件上传失败<br/>');
	}
	echo '文件上传成功<br/>';
	return $destination;
	
}else{
	echo "请选择上传图片!<br/>";
}
}	
?></span>


三、通过PHP代码实现多个文件的上传功能

<span ><?php
	//print_r($_FILES);
	header('Content-type:text/html;charset=utf-8');
	include_once 'multiUpload.php';
	$files = getFiles();
	print_r($files);
	foreach($files as $fileInfo){
		$file[] = uploadFile($fileInfo);
	}
	//array_values()返回数组中所有的值并给其建立数字索引。
	//array_filter()对数组进行过滤,去掉空值
	$uploadFile = array_values(array_filter($file));
	print_r($uploadFile);
?></span>

可以在页面上得到如下信息,可以看到上传成功文件的名称:

Array(    
    [0] => Array(
        [name] => IMG_20130930_120224.jpg            
        [type] => image/jpeg            
        [tmp_name] => D:\xampp\tmp\php4DEE.tmp            
        [error] => 0            
        [size] => 365134)    
    [1] => Array(            
        [name] => IMG_20130930_120314.jpg            
        [type] => image/jpeg            
        [tmp_name] => D:\xampp\tmp\php4DFE.tmp            
        [error] => 0            
        [size] => 383420)    
    [2] => Array(            
        [name] => IMG_20130930_120436.jpg            
        [type] => image/jpeg            
        [tmp_name] => D:\xampp\tmp\php4E3E.tmp            
        [error] => 0            
        [size] => 436443)    
    [3] => Array(            
        [name] => IMG_20130930_124607.jpg            
        [type] => image/jpeg            
        [tmp_name] => D:\xampp\tmp\php4E3F.tmp            
        [error] => 0            
        [size] => 468199)
    )
文件上传成功
文件上传成功
文件上传成功
文件上传成功
Array(    
    [0] => upload/4217e6f9a0251b2d8a59dec66cbe9810.jpg    
    [1] => upload/027b42fbff0117620e670b5710f8d45b.jpg    
    [2] => upload/d88ef934b7b6ebbc68c2e3afb79f05c2.jpg    
    [3] => upload/4048607fa33c73adb3473b21caa27aca.jpg)

www.htsjk.Com true http://www.htsjk.com/teradata/30178.html NewsArticle PHP实现多文件上传, PHP实现多文件上传,与单文件上传绝大部分是相同的,不过还是有区分的地方,主要有三点: 一、前端页面: 可以出现多个文件浏览按钮,也可以设置文件浏览按...
相关文章
    暂无相关文章
评论暂时关闭