Location: PHPKode > projects > Angora Guestbook > angora_1_5/guestbook/classes/auc/auc.class.php
<?php
##################################################################################
#
# File				: advancedUploadClass main class file containing auc class 
#					  and TrigerErrorException class.
# Class Title		: advancedUploadClass
# Class Description	: This class is used to handle the uploading of files.
#					  With advanced feature such as checking file size, checking
#					  file type, etc.
# Class Notes		: Please let me know if you have any questions / problems 
#					  / suggestions relating to this class.
# Copyright			: 2007
# Licence			: http://www.gnu.org/copyleft/gpl.html GNU var License
# Author 			: Mark Davidson <hide@address.com> 
#					  <http://design.fluxnetworks.co.uk>
# Created Date     	: 05/03/2007
# Last Modified    	: 10/03/2007
#
##################################################################################

/**
 * Modification on 16/11/2008
 */

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/jpg', 'image/png', 'image/gif', 'image/bmp', 'multipart/x-zip', 'application/x-zip-compressed', 'application/x-zip', 'application/zip'); //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
	private $zip_mime_types = array('multipart/x-zip', 'application/x-zip-compressed', 'application/x-zip', 'application/zip');
	
	/**
	 * 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>';*/
				
				$error = '';
				try {
					//check for $_FILES Errors
					switch ($files['error']) {
						case 0 : break;
						case 1 : $error = $files['name'].' exceeds the upload_max_filesize directive in php.ini'; break;
						case 2 : $error = $files['name'].' exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'; break;
						case 3 : $error = $files['name'].' 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'].' to disk'; break;
						case 8 : $error = $files['name'].' stopped by extension'; break;
						default : $error = 'Unidentified Error, caused by '.$files['name']; break;
					}
					if ($error) 
						throw new TrigerErrorException($error, $files['name']);
					
					//check that the file is not empty
					if ($files['size'] <= 0)
						throw new TrigerErrorException($files['name'].' is empty', $files['name']);
					
					//check that the file does not exceed the defined max_file_size
					if ($this->max_file_size) {
						if ($files['size'] >= $this->max_file_size) 
							throw new TrigerErrorException($files['name'].' exceeds defined max_file_size', $files['name']);
					}
					
					if ($this->check_file_type == 'allowed' && !in_array($files['type'], $this->allowed_mime_types)) {
						throw new TrigerErrorException($files['name'].' is not an allowed type', $files['name']);
					} elseif ($this->check_file_type == 'denied' && in_array($files['type'], $this->denied_mime_types)) {
						throw new TrigerErrorException($files['name'].' is a denied type', $files['name']);
					}
					
					//if make_safe is true call make safe function		
					if ($this->make_safe)
						$files['name'] = $this->make_safe($files['name']);
					
					//if overwrite is false and the file exists error
					if (!$this->overwrite && file_exists($this->upload_dir.$files['name']))
						throw new TrigerErrorException($files['name'].' already exsists', $files['name']);
						
					//move the uploaded file, error if anything goes wrong.
					if (!move_uploaded_file($files['tmp_name'], $this->upload_dir.$files['name']))
						throw new TrigerErrorException($files['name'].' could not be moved', $files['name']);
					
					// Check if zip... then unzip it
					if (in_array($files['type'], $this->zip_mime_types)) {
						include_once '../classes/dUnzip/dUnzip2.inc.php';
						include_once '../classes/dUnzip/dZip.inc.php';
						$zip = new dUnzip2($this->upload_dir.$files['name']);
						$zip->debug = false;
						$zip->getList();
						$zip->unzipAll($this->upload_dir);
						$zip->close();
						@unlink($this->upload_dir.$files['name']);
					}
					
				
					
				} catch (TrigerErrorException $e) {
					$errors[$files['name']][] = $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}";
   	}
}
?>
Return current item: Angora Guestbook