龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

仿开源中国,分享代码时候的多文件上传

时间:2014-07-22 14:49来源: 作者: 点击:
分享到:
有点标题党,不过确实是一个不错的多文件上传类。简洁实用。这个类可以用来处理表单上传多个文件。这个类可以检查文件是否不为空,也没有超过给定的大小限制。它也可以检查文
有点标题党,不过确实是一个不错的多文件上传类。简洁实用。
这个类可以用来处理表单上传多个文件。

这个类可以检查文件是否不为空,也没有超过给定的大小限制。

它也可以检查文件类型对允许和拒绝的文件类型列表。

该类还可以通过用下划线代替空格使最终的文件名更安全。

如果在上传文件时出现错误,类抛出一个异常对象,该对象提供有关错误代码和说明错误消息的信息。
代码珠玑:http://www.codepearl.com/files/194.html
<?php
//http://www.codepearl.com
$action = isset($_GET['action'])?$_GET['action']:"";
require_once('main.class.php');

$auc = new auc();

if ($action == 'uploadfile') {
	$auc = new auc();
	//Comment: $auc->upload_dir("directory name", "create dir if it does not exist, false by default or true");
	//$auc->upload_dir("/path/to/uploads/folder/with/trailing/slash/", false);
	//Comment: $auc->make_safe = true || false (default); make the file name safe
	//$auc->make_safe = true;
	//Comment: $auc->max_file_size = size in bytes (1MB default) || false; set max file size in bytes or false not to check size
	//$auc->max_file_size = 1048576;
	//Comment: $auc->overwrite = true || false (default); overwrite if file exists
	//$auc->overwrite = true;
	//Comment: $auc->check_file_type = false (default) || allowed || denied; 
	//$auc->check_file_type = 'allowed';	
	$result = $auc->upload("file");
	if (is_array($result)) {
		echo 'Something Went Wrong';
		echo '<pre>';
		var_dump($result);
		echo '</pre>';
	} else {
		echo 'All OK';
	}
} else {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Upload Class - Demo</title>
</head>
<body>
<form action="demo.php?action=uploadfile" method="post" enctype="multipart/form-data">
  <input name="file[]" type="file" /><br />
  <input name="file[]" type="file" /><br />
  <input name="upload" type="submit" value="Upload File" />
</form>
</body>
</html>
<?php  } ?>

3. [代码]操作类     跳至 [2] [3] [全屏预览]

<?php
//http://www.codepearl.com
class auc {
	public $errors = array(); //array used to store any errors that occur.
	public $upload_dir = ''; //the upload_dir being used by the script
	public $make_safe = false; //default don't modify the file name to safe version
	public $max_file_size = 1048576; //Max File Size in Bytes, 1MB
	public $overwrite = false; //default don't overwrite files that already exsist
	public $check_file_type = false; //don't check for file type by default but can check for allowed and denied files.
	public $allowed_mime_types = array('image/jpeg', 'image/png', 'image/gif', 'image/tiff'); //array of allowed mime types used when check_file_type is set to allowed
	public $denied_mime_types = array('application/x-php', 'text/html'); //array of denied mime types used when check_file_type is set to denied
	
	/**
	 * Check if the upload dir is valid, if it is not valid attempt to make the dir, if dir is succesfully created chmod it to 0777. 
	 * If any elments fail return false else set upload_dir and return true.
	 * @param string $dir
	 * @param boolean $mkdir
	 * @return true or false
	 */
	public function upload_dir($dir, $mkdir = false) {
		$errors =& $this->errors;
		$status = true;
		
		if (!is_dir($dir)) {
			if ($mkdir) {
				if (!mkdir($dir)) {
					$status = false;
				} else {
					if (!chmod($dir, 0777)) $status = false;
				}
			} else {
				$status = false;
			}
		}
		
		if ($status) {
			$this->upload_dir = $dir;
			return true;
		} else {
			$errors['general'][] = 'Upload Dir is Not Valid and/or a dir could not be created/chmod.';
			return false;
		}
	}
	
	/**
	 * check that the upload dir is valid and that it is writeable
	 *
	 * @param string $dir
	 * @return true or false
	 */
	public function check_dir($dir) {
		if (!is_dir($dir) || !is_writable($dir)) return false;
		
		return true;
	}
	

	/**
	 * make the uploaded file name safe
	 *
	 * @param string $file_name
	 * @return safe file name
	 */
	public function make_safe($file_name) {
		return str_replace(' ', '_', $file_name);
	}
		
	/**
	 * Check the Attemted Uploads for errors etc if everything goes good move the file, to the upload_dir.
	 *
	 * @param array $object
	 * @return unknown
	 */
	public function upload($object) {
		$errors =& $this->errors;
		
		if (empty($errors['general'])) {
			if (empty($this->upload_dir)) $this->upload_dir = dirname(__FILE__).'/'; //if no default upload_dir has been specified used the current dir.
					
			if ($this->check_dir($this->upload_dir)) {
				$files = $_FILES[$object];
				$count = count($files['name']) - 1;
				
				echo '<pre>';
				var_dump($files);
				echo '</pre>';
				
				for ($current = 0; $current <= $count; $current++) {
					$error = '';
					try {
						//check for $_FILES Errors
						switch ($files['error'][$current]) {
							case 0 : break;
							case 1 : $error = $files['name'][$current].' exceeds the upload_max_filesize directive in php.ini'; break;
							case 2 : $error = $files['name'][$current].' exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'; break;
							case 3 : $error = $files['name'][$current].' was only partially uploaded'; break;
							case 4 : $error = 'No file was uploaded'; break;
							case 6 : $error = 'Missing a temporary folder'; break;
							case 7 : $error = 'Failed to write '.$files['name'][$current].' to disk'; break;
							case 8 : $error = $files['name'][$current].' stopped by extension'; break;
							default : $error = 'Unidentified Error, caused by '.$files['name'][$current]; break;
						}
						if ($error) 
							throw new TrigerErrorException($error, $files['name'][$current]);
						
						//check that the file is not empty
						if ($files['size'][$current] <= 0)
							throw new TrigerErrorException($files['name'][$current].' is empty', $files['name'][$current]);
						
						//check that the file does not exceed the defined max_file_size
						if ($this->max_file_size) {
							if ($files['size'][$current] >= $this->max_file_size) 
								throw new TrigerErrorException($files['name'][$current].' exceeds defined max_file_size', $files['name'][$current]);
						}
						
						if ($this->check_file_type == 'allowed' && !in_array($files['type'][$current], $this->allowed_mime_types)) {
							throw new TrigerErrorException($files['name'][$current].' is not an allowed type', $files['name'][$current]);
						} elseif ($this->check_file_type == 'denied' && in_array($files['type'][$current], $this->denied_mime_types)) {
							throw new TrigerErrorException($files['name'][$current].' is a denied type', $files['name'][$current]);
						}
						
						//if make_safe is true call make safe function		
						if ($this->make_safe)
							$files['name'][$current] = $this->make_safe($files['name'][$current]);
						
						//if overwrite is false and the file exists error
						if (!$this->overwrite && file_exists($this->upload_dir.$files['name'][$current]))
							throw new TrigerErrorException($files['name'][$current].' already exsists', $files['name'][$current]);
							
						//move the uploaded file, error if anything goes wrong.
						if (!move_uploaded_file($files['tmp_name'][$current], $this->upload_dir.$files['name'][$current]))
							throw new TrigerErrorException($files['name'][$current].' could not be moved', $files['name'][$current]);
					} catch (TrigerErrorException $e) {
						$errors[$files['name'][$current]][] = $e->Message();
					}
				}
				
				if (empty($errors)) {
					//return true if there where no errors
					return true;
				} else {
					//return the errors array if there where any errros
					return $errors;
				}
			} else {
				//return false as dir is not valid
				$errors['general'][] = "The Specified Dir is Not Valid or is Not Writeable";
				return false;
			}
		}
	}	
}

/**
 * Handle the Exceptions trigered by errors within upload code.
 *
 */
class TrigerErrorException extends Exception {
	protected $file = "";
	public function __construct($message, $file = "", $code = 0) {
		$this->file = $file;
   		parent::__construct($message, $code);
	}

  	public function Message() {
		return "{$this->message}";
   	}
}
?>
精彩图集

赞助商链接