<?php
/***********************
* @功能 : 可单文件上传亦可多文件上传 可用getSaveInfo()函数调用原图的详细信息 用get_save_thumb()函数调用缩略图的路径信息
* 可生成缩略图 可预览上传图片 可预览缩略图 可添加图片水印 可添加文字水印 可用时间命名文件 可直接调用
* @注意事项: 1、 在创建图片文件夹时 会建立一个子文件夹用于存放缩略图
* 2、水印图片支持jpg gif png 3种
* 3、本类用到了imagettftext()函数,此函数需要 GD 库和 FreeType 库的支持
* *****************/
class upClass {
var $filename=array(); //input name
var $file_folder='upload/';//原图文件夹
var $detination='upfile/'; //缩略图文件夹路径
var $save_path; //保存路径 带文件名
var $renames; //rename为重命名 norename保留原名
var $save_info = array(); //用于保存原文件信息。
var $save_thumb=array();
var $maxsize; //上传最大尺寸
var $alltype=array('jpg', 'jpeg','png', 'gif','zip', 'rar');// 文件类型
var $watermark; // mark为添加水印 nomark或其他为不添加
var $watermarktype; //水印类型 1为图片水印 2为文字水印
var $waterposition; //水印位置 1为左上角 2为左下角3为居中 4为右上角 5为右下角
var $waterstring=""; //水印字符串
var $logo=""; //水印图片
var $imgpreview; //是否预览图片(view_thumb为缩略图,view_original为原图,noview或其他为不预览);
var $scale=0.5; //缩略图比例
function upClass($file,$folder,$path,$renames='norename',$maxsize=2097152,$type='',$imgpreview='noview',$watermark='nomark',$waterstring='',$logo='',$watermarktype=2,$waterposition=5) {
$this->filename=$file;
if($folder=''){
$this->file_folder=$folder;
}
if($path=''){
$this->file_folder.$this->detination=$path;
}
$this->maxsize=$maxsize;
$this->renames=$renames;
$this->watermark=$watermark;
$this->watermarktype=$watermarktype;
$this->logo=$logo;
$this->waterstring=$waterstring;
$this->waterposition=$waterposition;
$this->imgpreview=$imgpreview;
if($type=''){
$this->alltype=$type;
}
}
function upfile(){
for($i=0;$i<count($this->filename['name']);$i++){
//取当前文件名、临时文件名、大小、扩展名,后面将用到。
if($this->filename['error'][$i]==0){
$uname=$this->filename['name'][$i];
$size=$this->filename['size'][$i];
$tmpname=$this->filename['tmp_name'][$i];
$mime_type=$this->filename['type'][$i];
$type=$this->getFileExt($this->filename['name'][$i]);
//检测大小
$this->checksize($size);
//检测文件类型
$this->checktype($type);
//检测是否违法提交
if(!is_uploaded_file($tmpname)){
$this->show_error('请选择文件');
exit();
}
//是否重命名
$basename = $this->getBaseName($uname, ".".$type);
if($this->renames=='rename'){
$saveas = $basename."-".time().".".$type; //按时间命名
}elseif($this->renames=='norename'){
$saveas = $basename.".".$type; //覆盖相同文件名
}
//组合新文件名再存到指定目录下,格式:存储路径 + 文件名 + 时间 + 扩展名
if(!file_exists($this->file_folder)){
mkdir($this->file_folder,0777);
}
//建立子文件夹 用于存放缩略图
if(!file_exists($this->file_folder.$this->detination)){
mkdir($this->file_folder.$this->detination,0777);
}
$this->save_path= $this->file_folder.$saveas;
//是否有重复文件
$this->check_repeat($this->save_path);
//上传
if(!move_uploaded_file($tmpname,$this->save_path)){
$this->show_error('上传失败');
}
//保存信息
$this->save_info[]=array("name"=>$uname,
"type"=>$type,
"mime_type"=>$mime_type,
"size"=>$size,
"saveas" => $saveas,
"path"=>$this->save_path);
//是否添加水印
if($this->watermark=='mark'){
$viewarr= $this->getSaveInfo();
//echo count($viewarr);
$img=$viewarr[$i][path];
$this->imgmark_add($img,$this->logo,$this->watermarktype,$this->waterposition);
}
//是否预览
if($this->imgpreview=='view_thumb'){ //浏览缩略图
$viewarr= $this->getSaveInfo();
$view=$this->file_folder.$this->detination.$viewarr[$i][saveas];
if(!file_exists($view)){
$this->show_error('您未开启缩略图,如您不需要缩略图,请设置为浏览原图view_original');
}
$this->view($view);
}elseif($this->imgpreview=='view_original'){ //浏览原图
$viewarr= $this->getSaveInfo();
$view=$viewarr[$i][path];
$this->view($view);
}
}
}
return count($this->save_info);
}
//==========================
//检测文件大小
function checksize($size){
if($size > $this->filename){
$this->show_error('文件太大');
//exit();
}
}
//检测文件类型
function checktype($type){
if(!in_array($type,$this->alltype)){
$this->show_error('文件类型不符');
//exit();
}
}
//取得扩展名
function getFileExt($filename){
$stuff = pathinfo($filename);
return $stuff['extension'];
}
//取得给定文件文件名,不包括扩展名。
function getBaseName($filename, $type)
{
$basename = basename( $filename, $type);
//将中文名的编码换成gb2312的 防止中文乱码
//$basename = basename( iconv("UTF-8","gb2312",$filename), $type);
return $basename;
}
//检测是否有重名文件
function check_repeat($saveas){
if(file_exists($saveas)){
$this->show_error('文件已存在');
}
}
//保存原图信息
function getSaveInfo(){
return $this->save_info;
}
//保存缩略图信息
function get_save_thumb(){
return $this->save_thumb;
}
//出错信息
function show_error($str){
echo "<script language='javascript'>;alert('$str');history:location=go(-1);</script>";
}
//预览
function view($view){
$imgpreviewsize=1; //缩略图比例
$imgsize=@getimagesize($view);//取得文件尺寸和类型
$showtime=date("Y-m-d H:i:s");
echo "<br>图片预览:<br>";
echo "<img src=/"".$view."/" width=".($imgsize[0]*$imgpreviewsize)." height=".($imgsize[1]*$imgpreviewsize)."><br>";
echo "尺寸:".$imgsize[0]*$imgpreviewsize."X".$imgsize[1]*$imgpreviewsize."<br>";
echo "<br>文件名:".$view."/r上传时间:".$showtime."<br>";
}
//添加水印
function imgmark_add($img,$logo,$watermarktype,$waterposition){
//原图
$imginfo=GetImageSize($img); //首先取得文件尺寸和类型
switch($imginfo[2]){ //输出图片的格式
case 1:
$im=@ImageCreateFromGIF($img);
break;
case 2:
$im=@ImageCreateFromJPEG($img);
break;
case 3:
$im=@ImageCreateFromPNG($img);
break;
default:
$this->show_error("不支持的原图文件类型");
}
//水印图片
$ing=GetImageSize($logo); //首先取得文件尺寸和类型
switch($ing[2]){ //输出图片的格式
case 1:
$in=@ImageCreateFromGIF($logo);
break;
case 2:
$in=@ImageCreateFromJPEG($logo);
break;
case 3:
$in=@ImageCreateFromPNG($logo);
break;
default:
die("不支持的水印文件类型");
exit;
}
$im_w=$imginfo[0];
$im_h=$imginfo[1];
$ing_w=$ing[0];
$ing_h=$ing[1];
$str_x=strlen($this->waterstring);
switch($waterposition){
case 1: //左上角
//=====图片水印坐标
$w_x=10;
$h_x=5;
//=====文字水印坐标
$x=10;
$y=30;
break;
case 2: //左下角
//=====图片水印坐标
$w_x=10;
$h_x=$im_h-$ing_h-5;
//=====文字水印坐标
$x=10;
$y=$imginfo[1]-15;
break;
case 3: //居中
//=====图片水印坐标
$w_x=($im_w-$ing_w)/2;
$h_x=($im_h-$ing_h)/2;
//======文字水印坐标
$x=($imginfo[0]-$str_x)/2;
$y=($imginfo[1]-5)/2;
break;
case 4: //右上角
//=====图片水印坐标
$w_x=$im_w-$ing_w-10;
$h_x=5;
//======文字水印坐标
$x=$imginfo[0]-$str_x-130;
$y=30;
break;
case 5: //右下角
//=====图片水印坐标
$w_x=$im_w-$ing_w-10;
$h_x=$im_h-$ing_h-5;
//======文字水印坐标
$x=$imginfo[0]-$str_x-130;
$y=$imginfo[1]-30;
break;
}
switch($watermarktype){
case 1: //图片水印
imagecopy($im,$in,$w_x,$h_x,0,0,$ing[0],$ing[1]);//将logo复制到大图上
$cname=$this->getSaveInfo();
for($k=0;$k<count($cname);$k++){
$newimg=$this->file_folder.$this->detination.$cname[$k][saveas]; //设置缩略图的名称和路径
$this->save_thumb[]=array("saveas" => $this->file_folder.$this->detination.$cname[$k][saveas]);//保存路径和名称
$newimage=ImageCreateTrueColor($imginfo[0]*$this->scale,$imginfo[1]*$this->scale);//建立一个空真彩图
ImageCopyResized($newimage,$im,0,0,0,0,$imginfo[0]*$this->scale,$imginfo[1]*$this->scale,$imginfo[0],$imginfo[1]);
Imagejpeg($newimage,$newimg); // 生成新图片
imagedestroy($newimage);//销毁图像
}
break;
case 2: //文字水印
$te=imagecolorallocate($im,255,255,255);//建立一个空真彩图
imagettftext($im,20,0,$x,$y,$te,'Consolas.ttf',iconv("GBK","UTF-8",$this->waterstring)); //将文字写到大图上
$cname=$this->getSaveInfo();
for($k=0;$k<count($cname);$k++){
$newname=$this->file_folder.$this->detination.$cname[$k][saveas]; // 设置缩略图的名称和路径
$this->save_thumb[]=array("saveas" => $this->file_folder.$this->detination.$cname[$k][saveas]);//保存路径和名称
$newimage=ImageCreateTrueColor($imginfo[0]*$this->scale,$imginfo[1]*$this->scale);//建立一个空真彩图
ImageCopyResized($newimage,$im,0,0,0,0,$imginfo[0]*$this->scale,$imginfo[1]*$this->scale,$imginfo[0],$imginfo[1]);
Imagejpeg($newimage,$newname); // 生成新图片
imagedestroy($newimage);//销毁图像
}
break;
case 3: //只生成缩略图
$cname=$this->getSaveInfo();
for($k=0;$k<count($cname);$k++){
$newname=$this->file_folder.$this->detination.$cname[$k][saveas]; //设置缩略图的名称和路径
$this->save_thumb[]=array("saveas" => $this->file_folder.$this->detination.$cname[$k][saveas]);//保存路径和名称
$newimage=ImageCreateTrueColor($imginfo[0]*$this->scale,$imginfo[1]*$this->scale);//建立一个空真彩图
ImageCopyResized($newimage,$im,0,0,0,0,$imginfo[0]*$this->scale,$imginfo[1]*$this->scale,$imginfo[0],$imginfo[1]);
Imagejpeg($newimage,$newname); // 生成新图片
imagedestroy($newimage);//销毁图像
}
break;
}
}
}
// end CLASS
/****************演示************************/
if($_POST[Submit]!=''){
$files=$_FILES[user];
/*******************************
* @$file 是$_FILES[filename]
* @$folder 存放图片的路径 默认upload/
* @$path 存放缩略图片的路径 默认upfile/
* @$renames 等于'rename'时重命名,等于norename时保留原来的名称,并覆盖同名文件
* @$maxsize=2097152 上传文件最大值
* @$type 文件类型
* @$imgpreview view_thumb为缩略图,view_original为原图,noview或其他为不预览
* @$watermark 等于'mark'时添加水印
* @$waterstring 文字水印的内容,
* @$logo 水印图片
* @$watermarktype=2 水印类型 1为图片水印 2为文字水印 3为无水印(只是缩略图)
* @$waterposition=5 水印位置 1为左上角 2为左下角3为居中 4为右上角 5为右下角
* *****************************/
$up=new upClass($files,$folder,$path,'norename',1000000,$type,'view_original','nomark','beijing','upload/logo.jpg',3,5);
$num=$up->upfile();
if($num!=0){ //如果上传的文件不是0个
//$up->show_error('上传成功');
echo "上传成功";
}
$in=$up->get_save_thumb(); //缩略图文件信息
// print_r($in);
}
?>
<form name='form1' action='' method='post' enctype='multipart/form-data'>
<table width="60%" border="0" cellspacing="1" cellpadding="0" align="center">
<tr>
<td align='left'>
<input type='file' name='user[]' class='input1'>(只能上传GIF/JPEG图片,文件不能大于500K)<br />
<input type='file' name='user[]' class='input1'><br />
<input type="checkbox" value="1" name="check">要生成缩略图吗<br />
<input type='submit' name='Submit' value='开始上传' class='input2'>
<input name="action" type="hidden" id="action" value="3">
</td>
</tr>
</table>
</form>