有点标题党,不过确实是一个不错的多文件上传类。简洁实用。 这个类可以用来处理表单上传多个文件。 这个类可以检查文件是否不为空,也没有超过给定的大小限制。 它也可以检查文件类型对允许和拒绝的文件类型列表。 该类还可以通过用下划线代替空格使最终的文
有点标题党,不过确实是一个不错的多文件上传类。简洁实用。
这个类可以用来处理表单上传多个文件。
这个类可以检查文件是否不为空,也没有超过给定的大小限制。
它也可以检查文件类型对允许和拒绝的文件类型列表。
该类还可以通过用下划线代替空格使最终的文件名更安全。
如果在上传文件时出现错误,类抛出一个异常对象,该对象提供有关错误代码和说明错误消息的信息。
代码珠玑: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 class="brush:php;toolbar:false;">';
var_dump($result);
echo '';
} else {
echo 'All OK';
}
} else {
?>
<?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 class="brush:php;toolbar:false;">';
var_dump($files);
echo '';
for ($current = 0; $current 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}";
}
}
?>










