codetc - 网站开发技术 首页 代码 PHP 查看内容

支持动态添加的PHP多文件上传实例

2014-11-20 18:07| 发布者: CODETC| 查看: 2204| 评论: 0

       PHP的一个多文件上传实例(当然也可以用swfupload实现),可自定义上传文件的类型、设置允许上传文件的最大容量等功能;扩展性较强,这里给出的例子不支持多个选取,需要一个个添加,如果需要实现多选,请自行修改前端代码。程序的注释比较详细,如还有不明白的地方请在本文留言。


多文件上传类:
<?php
/*
 * 支持多文件上传,效验文件有效性后存储至指定目录。
 * 返回上传文件的相关有用信息供其它程序使用。(如文件名、类型、大小、保存路径)
 */
class UploadFile { 
	protected $user_post_file = array();	//上传文件列表
	protected $save_file_path;				//存放上传文件的路径
	protected $max_file_size;				//允许上传文件的最大尺寸
	protected $last_error;					//记录最后一次出错信息
	//设置默认允许上传的文件类型
	protected $allow_type = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf','docx');
	protected $final_file_path;				//最终保存的文件名
	protected $save_info = array();			//返回一组有用信息,用于提示用户。
 
	/**
	 * 构造函数
	 */
	function __construct($file, $path, $size = 2097152, $type = '') {
		$this->user_post_file = $file;
		if(!is_dir($path)){				//存储路径文件不存在就创建
			mkdir($path);
			chmod($path,0777);
		}
		$this->save_file_path = $path;
		$this->max_file_size = $size;	//如果用户不填写文件大小,则默认为2M.
		if ($type != '')
			$this->allow_type = $type;
	}
 
	/**
	 * 存储用户上传文件,检验合法性通过后,存储至指定位置。
	 */
	function upload() {
		for ($i = 0; $i < count($this->user_post_file['name']); $i++) {
			//如果当前文件上传功能,则执行下一步。
			if ($this->user_post_file['error'][$i] == 0) {
				//取当前文件名、临时文件名、大小、扩展名,后面将用到。
				$name = $this->user_post_file['name'][$i];
				$tmpname = $this->user_post_file['tmp_name'][$i];
				$size = $this->user_post_file['size'][$i];
				$mime_type = $this->user_post_file['type'][$i];
				$type = $this->getFileExt($this->user_post_file['name'][$i]);
				//检测当前上传文件大小是否合法。
				if (!$this->checkSize($size)) {
					$this->last_error = "The file size is too big. File name is: ".$name;
					$this->halt($this->last_error);
					continue;
				}
				//检测当前上传文件扩展名是否合法。
				if (!$this->checkType($type)) {
					$this->last_error = "Unallowable file type: .".$type." File name is: ".$name;
					$this->halt($this->last_error);
					continue;
				}
				//检测当前上传文件是否非法提交。
				if(!is_uploaded_file($tmpname)) {
					$this->last_error = "Invalid post file method. File name is: ".$name;
					$this->halt($this->last_error);
					continue;
				}
				//移动文件后,重命名文件。
				$basename = $this->getBaseName($name, ".".$type);
				//为防止文件名乱码
				$basename = iconv("UTF-8","gb2312", $basename);
				//移动后的文件名
				$saveas = $basename.time().".".$type;
				//组合新文件名再存到指定目录下,格式:存储路径 + 文件名 + 时间 + 扩展名
				$this->final_file_path = $this->save_file_path."/".$saveas;
				if(!move_uploaded_file($tmpname, $this->final_file_path)) {
					$this->last_error = $this->user_post_file['error'][$i];
					$this->halt($this->last_error);
					continue;
				}
				//存储当前文件的有关信息,以便其它程序调用。
				$this->save_info[] =  array("name" => $name, 
							"type" => $type,
							"mime_type" => $mime_type,
							"size" => $size, 
							"saveas" => $saveas,
							"path" => $this->final_file_path);
			}
		}
		return count($this->save_info); //返回上传成功的文件数目
	}
 
	/**
	 * 返回一些有用的信息,以便用于其它地方。
	 */
	function getSaveInfo() {
		return $this->save_info;
	}
 
	/**
	 * 检测用户提交文件大小是否合法
	 */
	function checkSize($size) {
		if ($size > $this->max_file_size) {
			return false;
		}else {
			return true;
		}
	}
 
	/**
	 * 检测用户提交文件类型是否合法
	 */
	function checkType($extension) {
		foreach ($this->allow_type as $type) {
			if (strcasecmp($extension , $type) == 0)
				return true;
		}
		return false;
	}
 
	/**
	 * 显示出错信息
	 */
	function halt($msg) {
		printf("<b><UploadFile Error:></b> %s <br>\n", $msg);
	}
 
	/**
	 * 取文件扩展名
	 */
	function getFileExt($filename) {
		$stuff = pathinfo($filename);
		return $stuff['extension'];
	}
	/**
	 * 取给定文件文件名,不包括扩展名。
	 */
	function getBaseName($filename, $type) {
		$basename = basename($filename, $type);
		return $basename;
	}
}
?>
使用方法:
<?php
if (!empty($_POST['submit'])) {
	$upload = new UploadFile($_FILES['files'], './tmp');
	//上传用户文件,返回int值,为上传成功的文件个数。
	$num = $upload->upload();
	if ($num != 0) {
		echo "上传成功<br>";
		echo $num."个文件上传成功";
	}else {
		echo "上传失败<br>";
	}
}
?>
前端HTML例子:
<script language="javascript" type="text/javascript">
function AddInput(){
	var input=document.createElement('input');//创建一个input节点
	var br=document.createElement('br');	  //创建一个br节点
	input.setAttribute('type','file');	  //设置input节点type属性为file
	input.setAttribute('name','files[]');	  //设置input节点name属性为files[],以 数组的方式传递给服务器端
	document.myForm.appendChild(br);	  //把节点添加到form1表单中
	document.myForm.appendChild(input);
}
</script>
<form name="myForm" enctype="multipart/form-data" method="POST" action="">
	<input type="file" name="files[]">
	<input type="submit" name="submit" value="上传"><a href="#" onclick="AddInput()">再添加一个</a>
</form>
文章来源 CODETC,欢迎分享,转载请注明地址: http://www.codetc.com/article-63-1.html

最新评论

 作为游客发表评论,请输入您的昵称

返回顶部