php 图片上传类代码


Posted in PHP onJuly 17, 2009

先来个简单的:

<? 
//https://3water.com 
class upLoad{ 
public $length; //限定文件大小 
public $file; //判断此类是用于图片上传还是文件上传 
public $fileName; //文件名 
public $fileTemp; //上传临时文件 
public $fileSize; //上传文件大小 
public $error; //上传文件是否有错,php4没有 
public $fileType; //上传文件类型 
public $directory; // 
public $maxLen; 
public $errormsg; 
function __construct($length,$file=true,$directory) 
{ 
$this->maxLen=$length; 
$this->length=$length*1024; 
$this->file=$file; //true为一般文件,false为图片的判断 
$this->directory=$directory; 
} 
public function upLoadFile($fileField) 
{ 
$this->fileName=$fileField['name']; 
$this->fileTemp=$fileField['tmp_name']; 
$this->error=$fileField['error']; 
$this->fileType=$fileField['type']; 
$this->fileSize=$fileField['size']; 
$pathSign = DIRECTORY_SEPARATOR; // / 
if($this->file) //一般文件上传 
{ 
$path = $this->_isCreatedDir($this->directory);//取得路径 
if($path)//https://3water.com 
{ 
$createFileType = $this->_getFileType($this->fileName);//设置文件类别 
$createFileName=uniqid(rand()); //随机产生文件名 
$thisDir=$this->directory.$pathSign.$createFileName.".".$createFileType; 
if(@move_uploaded_file($this->fileTemp,$thisDir)) //把临时文件移动到规定的路径下 
{ 
return $thisDir; 
} 
} 
}else{ //图片上传 
$path = $this->_isCreatedDir($this->directory);//取得路径 
if($path)//路径存在//https://3water.com 
{ 
$createFileType = $this->_getFileType($this->fileName);//设置文件类别 
$createFileName=uniqid(rand()); 
return @move_uploaded_file($this->fileTemp,$this->directory.$pathSign.$createFileName.".".$createFileType) ? true : false; 
} 
} 
} 
public function _isBig($length,$fsize) //返回文件是否超过规定大小 
{ 
return $fsize>$length ? true : false; 
} 
public function _getFileType($fileName) //获得文件的后缀 
{ 
return end(explode(".",$fileName)); 
} 
public function _isImg($fileType) //上传图片类型是否允许 
{ 
$type=array("jpeg","gif","jpg","bmp"); 
$fileType=strtolower($fileType); 
$fileArray=explode("/",$fileType); 
$file_type=end($fileArray); 
return in_array($file_type,$type);//https://3water.com 
} 
public function _isCreatedDir($path) //路径是否存在,不存在就创建 
{ 
if(!file_exists($path)) 
{ 
return @mkdir($path,0755)?true:false; //权限755// 
} 
else 
{ 
return true; 
} 
} 
public function showError() //显示错误信息 
{//https://3water.com 
echo "<Script Language ='JavaScript'>\n history.back();\n alert(' $this->errormsg');\n </Script> \n"; 
exit(); 
} 
} 
class multiUpLoad extends upLoad{ 
public $FILES; 
function __construct($arrayFiles,$length,$file=true,$directory) 
{ 
$this->FILES=$arrayFiles; 
parent::__construct($length,$file,$directory); 
} 
function upLoadMultiFile() 
{ 
$arr=array(); 
if($this->_judge()||$this->_judge()=="no") //文件全部符合规格,就开始上传 
{ 
foreach($this->FILES as $key=>$value) 
{ 
$strDir=parent::upLoadFile($this->FILES[$key]); 
array_push($arr, $strDir); 
} 
//https://3water.com 
return $arr; 
}else 
{ 
return false; 
} 
} 
function _judge() 
{ 
if($this->file) 
{ 
foreach($this->FILES as $key=>$value) 
{ 
if($this->_isBig($this->length,$value['size'])) 
{ 
$this->errormsg="文件超过 $this->maxLen K"; 
parent::showError(); 
} 
if($value['error']=UPLOAD_ERR_NO_FILE) 
{ 
//$this->errormsg="上传文件出现错误"; 
//parent::showError(); 
return "no"; 
} 
} 
return true; 
}else 
{ 
//https://3water.com 
foreach($this->FILES as $key=>$value) 
{ 
if($this->_isBig($this->length,$value['size'])) 
{ 
$this->errormsg="图片超过$this->maxLen"; 
parent::showError(); 
} 
if($value['error']!=0) 
{ 
$this->errormsg="上传图片出现错误"; 
parent::showError(); 
} 
if(!$this->_isImg($value['type'])) 
{ 
$this->errormsg="图片格式不对"; 
parent::showError(); 
} 
} 
return true; 
} 
} 
} 
?>

再来个复杂点的,可以自动生成缩略图的功能的php上传类
开始第一步:
创建文件夹,布局:
annex:附件(该目录下存放上传的原图片)
|— smallimg:存放缩略图片
|— mark:存放水印图片
include:存放类文件,字体(本程序代码使用的是:04B_08__.TTF)
|— upfile.php:集成简单上传,生成缩略图及水印的类文件信息
|— 04B_08__.TTF:字体文件
test.php:测试文件
第二步上传类
upfile.php
<?php 
class UPImages { 
var $annexFolder = "annex";//附件存放点,默认为:annex 
var $smallFolder = "smallimg";//缩略图存放路径,注:必须是放在 $annexFolder下的子目录,默认为:smallimg 
var $markFolder = "mark";//水印图片存放处 
var $upFileType = "jpg gif png";//上传的类型,默认为:jpg gif png rar zip 
var $upFileMax = 1024;//上传大小限制,单位是“KB”,默认为:1024KB 
var $fontType;//字体 
var $maxWidth = 500; //图片最大宽度 
var $maxHeight = 600; //图片最大高度 
function UPImages($annexFolder,$smallFolder,$includeFolder) { 
$this->annexFolder = $annexFolder; 
$this->smallFolder = $smallFolder; 
$this->fontType = $includeFolder."/04B_08__.TTF"; 
} 
function upLoad($inputName) { 
$imageName = time();//设定当前时间为图片名称 
if(@empty($_FILES[$inputName]["name"])) die(error("没有上传图片信息,请确认")); 
$name = explode(".",$_FILES[$inputName]["name"]);//将上传前的文件以“.”分开取得文件类型 
$imgCount = count($name);//获得截取的数量 
$imgType = $name[$imgCount-1];//取得文件的类型 
if(strpos($this->upFileType,$imgType) === false) die(error("上传文件类型仅支持 ".$this->upFileType." 不支持 ".$imgType)); 
$photo = $imageName.".".$imgType;//写入数据库的文件名 
$uploadFile = $this->annexFolder."/".$photo;//上传后的文件名称 
$upFileok = move_uploaded_file($_FILES[$inputName]["tmp_name"],$uploadFile); 
if($upFileok) { 
$imgSize = $_FILES[$inputName]["size"]; 
$kSize = round($imgSize/1024); 
if($kSize > ($this->upFileMax*1024)) { 
@unlink($uploadFile); 
die(error("上传文件超过 ".$this->upFileMax."KB")); 
} 
} else { 
die(error("上传图片失败,请确认你的上传文件不超过 $upFileMax KB 或上传时间超时")); 
} 
return $photo; 
} 
function getInfo($photo) { 
$photo = $this->annexFolder."/".$photo; 
$imageInfo = getimagesize($photo); 
$imgInfo["width"] = $imageInfo[0]; 
$imgInfo["height"] = $imageInfo[1]; 
$imgInfo["type"] = $imageInfo[2]; 
$imgInfo["name"] = basename($photo); 
return $imgInfo; 
} 
function smallImg($photo,$width=128,$height=128) { 
$imgInfo = $this->getInfo($photo); 
$photo = $this->annexFolder."/".$photo;//获得图片源 
$newName = substr($imgInfo["name"],0,strrpos($imgInfo["name"], "."))."_thumb.jpg";//新图片名称 
if($imgInfo["type"] == 1) { 
$img = imagecreatefromgif($photo); 
} elseif($imgInfo["type"] == 2) { 
$img = imagecreatefromjpeg($photo); 
} elseif($imgInfo["type"] == 3) { 
$img = imagecreatefrompng($photo); 
} else { 
$img = ""; 
} 
if(empty($img)) return False; 
$width = ($width > $imgInfo["width"]) ? $imgInfo["width"] : $width; 
$height = ($height > $imgInfo["height"]) ? $imgInfo["height"] : $height; 
$srcW = $imgInfo["width"]; 
$srcH = $imgInfo["height"]; 
if ($srcW * $width > $srcH * $height) { 
$height = round($srcH * $width / $srcW); 
} else { 
$width = round($srcW * $height / $srcH); 
} 
if (function_exists("imagecreatetruecolor")) { 
$newImg = imagecreatetruecolor($width, $height); 
ImageCopyResampled($newImg, $img, 0, 0, 0, 0, $width, $height, $imgInfo["width"], $imgInfo["height"]); 
} else { 
$newImg = imagecreate($width, $height); 
ImageCopyResized($newImg, $img, 0, 0, 0, 0, $width, $height, $imgInfo["width"], $imgInfo["height"]); 
} 
if ($this->toFile) { 
if (file_exists($this->annexFolder."/".$this->smallFolder."/".$newName)) @unlink($this->annexFolder."/".$this->smallFolder."/".$newName); 
ImageJPEG($newImg,$this->annexFolder."/".$this->smallFolder."/".$newName); 
return $this->annexFolder."/".$this->smallFolder."/".$newName; 
} else { 
ImageJPEG($newImg); 
} 
ImageDestroy($newImg); 
ImageDestroy($img); 
return $newName; 
} 
function waterMark($photo,$text) { 
$imgInfo = $this->getInfo($photo); 
$photo = $this->annexFolder."/".$photo; 
$newName = substr($imgInfo["name"], 0, strrpos($imgInfo["name"], ".")) . "_mark.jpg"; 
switch ($imgInfo["type"]) { 
case 1: 
$img = imagecreatefromgif($photo); 
break; 
case 2: 
$img = imagecreatefromjpeg($photo); 
break; 
case 3: 
$img = imagecreatefrompng($photo); 
break; 
default: 
return False; 
} 
if (empty($img)) return False; 
$width = ($this->maxWidth > $imgInfo["width"]) ? $imgInfo["width"] : $this->maxWidth; 
$height = ($this->maxHeight > $imgInfo["height"]) ? $imgInfo["height"] : $this->maxHeight; 
$srcW = $imgInfo["width"]; 
$srcH = $imgInfo["height"]; 
if ($srcW * $width > $srcH * $height) { 
$height = round($srcH * $width / $srcW); 
} else { 
$width = round($srcW * $height / $srcH); 
} 
if (function_exists("imagecreatetruecolor")) { 
$newImg = imagecreatetruecolor($width, $height); 
ImageCopyResampled($newImg, $img, 0, 0, 0, 0, $width, $height, $imgInfo["width"], $imgInfo["height"]); 
} else { 
$newImg = imagecreate($width, $height); 
ImageCopyResized($newImg, $img, 0, 0, 0, 0, $width, $height, $imgInfo["width"], $imgInfo["height"]); 
} 
$white = imageColorAllocate($newImg, 255, 255, 255); 
$black = imageColorAllocate($newImg, 0, 0, 0); 
$alpha = imageColorAllocateAlpha($newImg, 230, 230, 230, 40); 
ImageFilledRectangle($newImg, 0, $height-26, $width, $height, $alpha); 
ImageFilledRectangle($newImg, 13, $height-20, 15, $height-7, $black); 
ImageTTFText($newImg, 4.9, 0, 20, $height-14, $black, $this->fontType, $text[0]); 
ImageTTFText($newImg, 4.9, 0, 20, $height-6, $black, $this->fontType, $text[1]); 
if($this->toFile) { 
if (file_exists($this->annexFolder."/".$this->markFolder."/".$newName)) @unlink($this->annexFolder."/".$this->markFolder."/".$newName); 
ImageJPEG($newImg,$this->annexFolder."/".$this->markFolder."/".$newName); 
return $this->annexFolder."/".$this->markFolder."/".$newName; 
} else { 
ImageJPEG($newImg); 
} 
ImageDestroy($newImg); 
ImageDestroy($img); 
return $newName; 
} 
} 
?>

第三步:测试上传类
test.php
<?php 
$annexFolder = "annex"; 
$smallFolder = "smallimg"; 
$markFolder = "mark"; 
$includeFolder = "include"; 
require("./".$includeFolder."/upfile.php"); 
$img = new UPImages($annexFolder,$smallFolder,$includeFolder); 
$text = array("3water.com","all rights reserved"); 
if(@$_GET["go"]) { 
$photo = $img->upLoad("upfile"); 
$img->maxWidth = $img->maxHeight = 350;//设置生成水印图像值 
$img->toFile = true; 
$newSmallImg = $img->smallImg($photo); 
$newMark = $img->waterMark($photo,$text); 
echo "<img src='".$newSmallImg."' border='0'><br><br>"; 
echo "<img src='".$newMark."' border='0'><br><br>"; 
echo "<a href='./test.php'>继续上传</a>"; 
} else { 
?> 
<form method="post" action="./test.php?go=go" enctype="multipart/form-data"> 
<input type="file" name="upfile"><br><br> 
<input type="submit" value="上传"> 
</form> 
<?php 
} 
?>
PHP 相关文章推荐
一个php作的文本留言本的例子(一)
Oct 09 PHP
图书管理程序(三)
Oct 09 PHP
PHP+Tidy-完美的XHTML纠错+过滤
Apr 10 PHP
深入for,while,foreach遍历时间比较的详解
Jun 08 PHP
php发送post请求的三种方法
Feb 11 PHP
discuz目录文件资料汇总
Dec 30 PHP
一个非常完美的读写ini格式的PHP配置类分享
Feb 12 PHP
php实现文本数据导入SQL SERVER
May 17 PHP
深入理解php printf() 输出格式化的字符串
May 23 PHP
Yii2中SqlDataProvider用法示例
Sep 22 PHP
PHP二维数组去重实例分析
Nov 18 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
PHP源码之 ext/mysql扩展部分
Jul 17 #PHP
php 小乘法表实现代码
Jul 16 #PHP
php at(@)符号的用法简介
Jul 11 #PHP
php str_pad 函数用法简介
Jul 11 #PHP
php strlen mb_strlen计算中英文混排字符串长度
Jul 10 #PHP
UTF8编码内的繁简转换的PHP类
Jul 09 #PHP
PHP 程序授权验证开发思路
Jul 09 #PHP
You might like
PHPLog php 程序调试追踪工具
2009/09/09 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
python小白学习包管理器pip安装
2020/06/09 Python
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
.NET现在共支持多少种语言
2014/02/26 面试题
记帐员岗位责任制
2014/02/08 职场文书
高中历史教学反思
2014/02/08 职场文书
高三学习决心书
2014/03/11 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
护理专业毕业自我鉴定
2019/08/12 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript