说明:
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>
*/
?>
相关阅读
<完>