首页 » 后端 » PHP » 正文

上传类upload.class.php

发布者:站点默认
2011/01/24 浏览数(3,286) 分类:PHP 评论(1)

说明:

PHP文件上传类。上传时区分两种类型:image(图片)、file(普通文件)。image: 可以生成缩略图和投影;file: 可设置过滤文件类型。集成“图片上传类”和“文件上传类”。

用法:

上传普通文件:

<?php
include('upload.class.php');
if (isset($_GET['up'])){
	$up = new upload(); // 完整格式:$up = new upload('上传类型', '附件保存位置');
	$up->uploadFileType = 'file';
	// 上边两行了可以简写为:$up = new upload(‘file');
	$up->denyType = 'asp,php,aspx,jsp,html,js,vbs'; // 禁止上传带有此扩展名的文件
	$result = $up->save('upfile'); // HTML中<input />的name属性值
	echo '结果:' . $result; // 如果成功返回地址,否则返回FALSE,错误信息保存在“$up->error”。
	if (!$up->error){
		echo '成功';
	}else{
		echo '失败,错误信息:' . $up->error;
	}
}
?>
<form method="post" action="?up" enctype="multipart/form-data"> 
<input type="file" name="upfile"><br><br> 
<input type="submit" value="上传"> 
</form> 

上传图片:

<?php
include('upload.class.php');
if (isset($_GET['up'])){
	$up = new upimg(); // 完整格式:$up = new upload('上传类型', '图片保存位置', '缩略图保存位置');
	$up->uploadFileType = 'image';
	// 上边两行了可以简写为:$up = new upload(‘image');
	$up->thumbWidth = 160;
	$up->thumbHeight = 120;
	$up->autoShandow = TRUE;
	$up->shandowX = 4;
	$up->shandowY = 4;
	$up->shondowColor = 'CCCCCC';
	$result = $up->save('upfile'); // HTML中<input />的name属性值,如果成功返回图片地址,否则返回FALSE,错误信息保存在"$up->error"。
	$thumb = $up->thumbPath;
	if (!$up->error){
		echo '成功';
	}else{
		echo '失败,错误信息:' . $up->error;
	}
}
echo '结果:<img src="' . $thumb . '" />';
//或者:echo '结果:<img src="' . $up->getThumbPath($result). '" />';
?>
<form method="post" action="?up&<?php echo rand();?>" enctype="multipart/form-data"> 
<input type="file" name="upfile"><br><br> 
<input type="submit" value="上传"> 
</form> 

下载:

upload.class.php.tar.gz (为什么此附件的地址不能分享给朋友们下载?)

代码:

<?php
/**
 * 说明:上传类。区分两种类型:image(图片)、file(普通文件)。
 *    image: 可以生成缩略图和阴影
 *    file: 可过滤文件类型
 * 日期:12:07 2011年1月24日 星期一
 */
class upload{
	public $uploadFolder = 'upload'; // 图片存放目录(末尾不要加"/")
	public $thumbFolder = 'upload/thumb'; // 缩略图(末尾不要加"/")
	public $autoSubfolder = TRUE; // 是否自动创建下级目录
	public $SubfolderFormat = 'Y-m'; // 子目录格式(使用DATE函数的格式)
	public $uploadFileType = 'file'; // 上传类型:file或image
	// 如果上传类型是:file
	public $denyFileType = 'asp,php,aspx,jsp,html,js,vbs'; // 拒绝上传的扩展名(不是文件类型!)
	// 如果上传类型是:imgae
	public $autoThumb = TRUE; // 是否自动生成缩略图
	public $thumbWidth = 160; // 缩略图最大宽度
	public $thumbHeight = 120; // 缩略图最大高度
	public $autoShandow = FALSE; // 是否自动对缩略图生成阴影
	public $shandowX = 5; // 投影相对于原图的左边距
	public $shandowY = 5; // 投影相对于原图的底边距
	public $shandowLength = 3; // 投影长度
	public $shondowColor = 'CCC'; // 四种投影颜色格式:#1FCC2B、#EEE、1FCC2B、EEE
	// 上传结果
	public $error = ''; // 错误信息
	public $imgPath = ''; // 上传成功后的图片位置
	public $thumbPath = ''; // 上传成功后的缩略图位置
	public $filePath = ''; // 上传成功后的文件位置
	
	// 说明:初始化
	function __construct($uploadFileType = '', $uploadFolder = '', $thumbFolder = ''){
		empty($uploadFolder) ? '' : $this->uploadFolder = $uploadFolder;
		empty($thumbFolder) ? '' : $this->thumbFolder = $thumbFolder;
		empty($uploadFileType) ? '' : $this->uploadFileType = $uploadFileType;
		if ('file' != $this->uploadFileType && 'image' != $this->uploadFileType){
			$this->uploadFileType = 'file';
		}else{
			$this->uploadFileType = strtolower($this->uploadFileType);
		}
	}
	
	// 说明:上传图片,参数是<input />的name属性值;成功返回图片的相对URL,失败返回FALSE和错误信息(在$this->error里)
	// bool/sting upload(string $html_tags_input_attrib_name);
	function save($inputName){ // 上传操作,参数是input标签的name属性。
		$this->_mkdir(); // 创建存放目录
		if ($this->error){ // 如果有错,直接返回(例如_mkdir)
			return FALSE;
		}
		if(!$_FILES[$inputName]["name"]){
			$this->error = '没有上传文件';
			return FALSE;
		}
		if($_FILES[$inputName]["name"]){
			$isUpFile = $_FILES[$inputName]['tmp_name'];
			if (is_uploaded_file($isUpFile)){
				if ('image' == $this->uploadFileType){
					// 图片上传
					$imgInfo = $this->_getinfo($isUpFile);
					if (FALSE == $imgInfo){
						return FALSE;
					}
					$extName = $imgInfo['type'];
					$microSenond = floor(microtime()*10000);// 取一个毫秒级数字,4位。
					$newFileName = $uploadFolder . '/' . date('YmdHis') . $microSenond . '.' . $extName ; // 所上传图片的新名字。
					$location = $this->uploadFolder . $newFileName;
					$result = move_uploaded_file($isUpFile, $location);
					if ($result){
						if (TRUE == $this->autoThumb){ // 是否生成缩略图
							$thumb = $this->thumb($location, $this->thumbWidth, $this->thumbHeight);
							if (FALSE == $thumb){
								return FALSE;
							}
						}
						$this->imgPath = $location;
						return $location;
					}else{
						$this->error = '移动临时文件时出错';
						return FALSE;
					}
				}else if ('file' == $this->uploadFileType){
					// 文件上传
					$extName = $this->_checkType($_FILES[$inputName]["name"]);
					if (FALSE == $extName){
						return FALSE;
					}
					$microSenond = floor(microtime()*10000);// 取一个毫秒级数字,4位。
					$newFileName = $uploadFolder . '/' . date('YmdHis') . $microSenond . '.' . $extName ; // 所上传文件的新名字。
					$location = $this->uploadFolder . $newFileName;
					$result = @move_uploaded_file($isUpFile, $location);
					if ($result){
						$this->filePath = $location;
						return $location;
					}else{
						$this->error = '移动临时文件时出错';
						return FALSE;
					}
				}else{
					$this->error = '未知错误:文件类型';
					return FALSE;
				}
			}else{
				$uploadError = $_FILES[$inputName]['error'];
				if (1 == $uploadError){ // 文件大小超过了php.ini中的upload_max_filesize
					$this->error = '文件太大,服务器拒绝接收大于' . ini_get('upload_max_filesize') . '的文件';
					return FALSE;
				}elseif (3 == $uploadError){ // 上传了部分文件
					$this->error = '上传中断,请重试';
					return FALSE;
				}elseif (4 == $uploadError){
					$this->error = '没有文件被上传';
					return FALSE;
				}elseif (6 == $uploadError){
					$this->error = '找不到临时文件夹,请联系您的服务器管理员';
					return FALSE;
				}elseif (7 == $uploadError){
					$this->error = '文件写入失败,请联系您的服务器管理员';
					return FALSE;
				}else{
					if (0 != $uploadError){
						$this->error = '未知上传错误,请联系您的服务器管理员';
						return FALSE;
					}
				}
			}
		}
		
	}
	
	// 说明:获取图片信息,参数是上传后的临时文件,成功返回数组,失败返回FALSE和错误信息
	// array/bool _getinfo(string $upload_tmp_file)
	private function _getinfo($img){
		$tempfile = @fopen($img, "rb");
		$bin = fread($tempfile, 2); //只读2字节  
		fclose($tempfile);
		$strInfo = @unpack("C2chars", $bin);
		$typeCode = intval($strInfo['chars1'] . $strInfo['chars2']);
		$fileType = '';
		switch ($typeCode){ // 6677:bmp 255216:jpg 7173:gif 13780:png 7790:exe 8297:rar 8075:zip tar:109121 7z:55122 gz 31139
			case '255216':
				$fileType = 'jpg';
				break;
			case '7173':
				$fileType = 'gif';
				break;
			case '13780':
				$fileType = 'png';
				break;
			default:
				$fileType = 'unknown';
		}
		if ($fileType == 'jpg' || $fileType == 'gif' || $fileType == 'png'){
			$imageInfo = getimagesize($img);
			$imgInfo['size'] = $imageInfo['bits'];
			$imgInfo["type"] = $fileType;
			$imgInfo["width"] = $imageInfo[0];
			$imgInfo["height"] = $imageInfo[1];
			return $imgInfo;
		}else{ // 非图片类文件信息
			$this->error = '图片类型错误';
			return FALSE;
		}
	} // end _getinfo
	
	// 检测扩展名是否允许(因未知扩展名太多,故不严格检测(只据扩展名,不据文件头))
	private function _checkType($file){
		$extName = preg_replace('/.*\.(.*[^\.].*)*/iU','\\1', $file);
		if (empty($extName)){
			$extName = 'unKnown';
		}
		$denyTypes = strtolower($this->denyFileType); // 先转成小写
		$denyTypes = explode(',', $this->denyFileType); // 再分解数组
		foreach ($denyTypes as $ext){
			$ext = strtolower($ext);
			if ($extName == $ext){
				$this->error = '不允许上传的文件类型:' . $extName;
				return FALSE;
			}
		}
		if (!$this->error){
			return $extName;
		}
	}
	
	// 说明:生成缩略图,等比例缩放或拉伸
	// bool/string thumb(string $uploaded_file, int $thumbWidth, int $thumbHeight, string $thumbTail);
	function thumb($img, $thumbWidth = '', $thumbHeight = '', $thumbTail = '_thumb'){
		$filename = $img; // 保留一个名字供新的缩略图名字使用
		$imgInfo = $this->_getinfo($img);
		if (FALSE == $imgInfo){
			return FALSE;
		}
		$imgType = $imgInfo['type'];
		switch ($imgType){ // 创建一个图,并给出扩展名
			case "jpg" :
				$img = imagecreatefromjpeg($img);
				$ext_name = 'jpg';
				break;
			case 'gif' :
				$img = imagecreatefromgif($img);
				$ext_name = 'gif';
				break;
			case 'png' :
				$img = imagecreatefrompng($img);
				$ext_name = 'png';
				break;
			default : // 如果类型错误,生成一张空白图
				$img = imagecreate($thumbWidth,$thumbHeight);
				imagecolorallocate($img,0x00,0x00,0x00);
				$ext_name = 'jpg';
		}
		// 缩放后的图片尺寸(小则拉伸,大就缩放)
		$imgWidth = $imgInfo['width'];
		$imgHeight = $imgInfo['height'];
		if ($imgHeight > $imgWidth){ // 竖图
			$newHeight = $thumbHeight;
			$newWidth = ceil($imgWidth / ($imgHeight / $thumbHeight ));
		}else if($imgHeight < $imgWidth){ // 横图
			$newHeight = ceil($imgHeight / ($imgWidth / $thumbWidth ));
			$newWidth = $thumbWidth;
		}else if($imgHeight == $imgWidth){ // 等比例图
			$newHeight = $thumbWidth;
			$newWidth = $thumbWidth;
		}
		// 生成图层
		$bgimg = imagecreatetruecolor($newWidth,$newHeight);
		$bg = imagecolorallocate($bgimg,0xFF,0xFF,0xFF);
		imagefill($bgimg,0,0,$bg);
		// 投影
		if (TRUE == $this->autoShandow){
			// 处理投影长度
			$this->shandowX = abs($this->shandowX);
			$this->shandowX = abs($this->shandowX);
			// 处理投影颜色
			$shandowColor = strtoupper($this->shondowColor);
			if (empty($shandowColor)){
				$shandowColor = '#CCCCCC';
			}else{
				$shandowColorValueLength = strlen($shandowColor);
				if (7 == $shandowColorValueLength || 6 == $shandowColorValueLength){
					$rgbB = substr($this->shondowColor,-2,2);
					$rgbG = substr($this->shondowColor,-4,2);
					$rgbR = substr($this->shondowColor,-6,2);
				}else if (4 == $shandowColorValueLength || 3 == $shandowColorValueLength){
					$rgbB = substr($this->shondowColor,-1,1);
					$rgbG = substr($this->shondowColor,-2,1);
					$rgbR = substr($this->shondowColor,-3,1);
					$rgbB .= $rgbB; // C->CC
					$rgbG .= $rgbG; // G->GG
					$rgbR .= $rgbR;
				}else{
					$rgbB = $rgbG = $rgbR = 'CC';
				}
			}
			$rgbR = hexdec($rgbR);
			$rgbG = hexdec($rgbG);
			$rgbB = hexdec($rgbB);
			// 生成投影
			$newWidth = $newWidth - $this->shandowX;
			$newHeight = $newHeight - $this->shandowY;
			$shandowImg = imagecreatetruecolor($newWidth,$newHeight);
			$shandowBg = imagecolorallocate($shandowImg,$rgbR,$rgbG,$rgbB);
			@imagefill($shandowImg,0,0,$shandowBg);
			$shandowXOffset = round($this->shandowX / 2); // 偏移后留出模糊区域
			$shandowYOffset = round($this->shandowY / 2);
			$sampled = imagecopy ($bgimg, $shandowImg, $shandowXOffset, $shandowYOffset, 0, 0, $newWidth, $newHeight);
			$shandow = imagefilter($bgimg,IMG_FILTER_GAUSSIAN_BLUR); // 用高斯算法模糊图像
			$shandow = imagefilter($bgimg,IMG_FILTER_SELECTIVE_BLUR); // 模糊图像
		}
		// 生成图片
		$sampled = imagecopyresampled($bgimg,$img,0,0,0,0,$newWidth,$newHeight,$imgWidth,$imgHeight);
		
		if(!$sampled ){
			$this->error = '缩略图生成失败';
			@unlink($this->uploadFolder . '/' . $filename); // 删除上传的图片
			return FALSE;
		}
		$filename = basename($filename);
		$newFileName = substr($filename, 0, strrpos($filename, ".")) . $thumbTail . '.' . $ext_name ; // 新名字
		$thumbPath = $this->thumbFolder . '/' . $newFileName;
		switch ($ext_name){
			case 'jpg':
				$result = imagejpeg($bgimg, $thumbPath);
				break;
			case 'gif':
				$result = imagegif($bgimg, $thumbPath);
				break;
			case 'png':
				$result = imagepng($bgimg, $thumbPath);
				break;
			default: // 上边判断类型出错时会创建一张空白图,并给出扩展名为jpg
				$result = imagejpeg($bgimg, $thumbPath);
		}
		if ($result){
			$this->thumbPath = $thumbPath;
			return $thumbPath;
		}else{
			$this->error = '缩略图创建失败';
			@unlink($this->uploadFolder . '/' . $filename); // 删除上传的图片
			return FALSE;
		}
	} // end thumb
	
	// 说明:创建文件存放目录
	private function _mkdir(){
		$baseDir = dirname($this->uploadFolder);
		if(!is_writable($baseDir)){
			$this->error = '基目录不可写';
			return FALSE;
		}
		// 创建文件上传目录
		if(!is_dir($this->uploadFolder)){
			$mkdirResutlt = @mkdir($this->uploadFolder);
			if (!$mkdirResutlt){
				$this->error = '存放图片的目录创建失败';
				return FALSE;
			}
		}
		// 创建缩略图目录
		if(!is_dir($this->thumbFolder) && TRUE == $this->autoThumb && 'image' == $this->uploadFileType){
			$mkdirResutlt = @mkdir($this->thumbFolder);
			if (!$mkdirResutlt){
				$this->error = '存放缩略图的目录创建失败';
				return FALSE;
			}
		}
		// 创建子目录
		if($this->autoSubfolder){
			$subFolder = date($this->SubfolderFormat);
			$newUploadFolder = $this->uploadFolder . '/' . $subFolder;
			if(!is_dir($newUploadFolder)){
				$mkdirResutlt = @mkdir($newUploadFolder);
				if(!$mkdirResutlt){
					$this->error = '下级目录创建失败';
					return FALSE;
				}
			}
			$newThumbFolder = $this->thumbFolder . '/' . $subFolder;
			if(!is_dir($newThumbFolder) && 'image' == $this->uploadFileType){
				$mkdirResutlt = @mkdir($newThumbFolder);
				if(!$mkdirResutlt){
					$this->error = '下级缩略图目录创建失败';
					return FALSE;
				}
			}
			$this->uploadFolder = $newUploadFolder;
			$this->thumbFolder = $newThumbFolder;
		}
	}
	// 调取图片的缩略图名字
	// 效果:/upload/20100506.jpg -> /upload/20100506_thumb.jpg
	public function getThumbPath($filename, $tail = '_thumb'){
		if(empty($filename)){
			return '';
		}
		$extstr=explode('.', $filename);
		if (2 <= count($extstr)){ // 有扩展名(可有多个,比如"filebasename.b.c.d.kkk")
			$count=count($extstr)-1;
		}else{
			return $filename . $tail; // 没有扩展名的话,直接加个"尾巴"后输出
		}
		$extname = $extstr[$count];
		$newname = substr($filename, 0, strrpos($filename, ".")) . $tail . "." . $extname;
		return str_replace($this->uploadFolder, $this->thumbFolder, $newname);
	}
}
?>
<?php // 用法
/*
<?php
include('upload.class.php');
if (isset($_GET['up'])){
	$up = new upload();
	$up->uploadFileType = 'image';
	$up->thumbWidth = 160;
	$up->thumbHeight = 120;
	$up->autoShandow = TRUE;
	$up->shandowX = 4;
	$up->shandowY = 4;
	$up->shondowColor = 'CCCCCC';
	$result = $up->save('upfile'); // HTML中<input />的name属性值
	$thumb = $up->thumbPath;
	if (!$up->error){
		echo '成功';
	}else{
		echo '失败,错误信息:' . $up->error;
	}
}
echo '结果:<img src="' . $thumb . '" />'; // 如果成功返回图片地址,否则返回FALSE,错误信息保存在"$up->error"。
?>
<form method="post" action="?up&<?php echo rand();?>" enctype="multipart/form-data"> 
<input type="file" name="upfile"><br><br> 
<input type="submit" value="上传"> 
</form> 
*/
?>

相关阅读

  • 图片上传类:只能上传图片(验证文件头),可生成缩略图、投影(无水印功能)。
  • 文件上传类:供上传普通文件,可设置过滤的文件扩展名,上传图片时不生成缩略图、投影。

<完>

点击返回顶部
  1. 留言
  2. 联系方式