Maison >php教程 >PHP源码 >图片上传类;支持水印-日期文件夹-生成缩略图 ,支持多文件上传,给力分享

图片上传类;支持水印-日期文件夹-生成缩略图 ,支持多文件上传,给力分享

PHP中文网
PHP中文网original
2016-05-25 17:12:181202parcourir

可以用{Y}{m}{n}来变成现在的日期
如题

<?php

class upload { 

 var $dir; //附件存放物理目录 
 var $time; //自定义文件上传时间 
 var $allow_types; //允许上传附件类型 
 var $field; //上传控件名称 
 var $maxsize; //最大允许文件大小,单位为KB 

 var $thumb_width; //缩略图宽度 
 var $thumb_height; //缩略图高度 

 var $watermark_file; //水印图片地址 
 var $watermark_pos; //水印位置 
 var $watermark_trans;//水印透明度 


//构造函数
 //$types : 允许上传的文件类型 , $maxsize : 允许大小 , $field : 上传控件名称 , $time : 自定义上传时间 
 function upload($types = &#39;jpg|png&#39;, $maxsize = 1024, $field = &#39;attach&#39;, $time = &#39;&#39;) { 
 $this->allow_types = explode(&#39;|&#39;,$types); 
 $this->maxsize = $maxsize * 1024; 
 $this->field = $field; 
 $this->time = $time ? $time : time(); 
}

//设置并创建文件具体存放的目录
 //$basedir : 基目录,必须为物理路径 
 //$filedir : 自定义子目录,可用参数{y}、{m}、{d} 
 function set_dir($basedir,$filedir = &#39;&#39;) { 
 $dir = $basedir; 
 !is_dir($dir) && @mkdir($dir,0777); 
 if (!empty($filedir)) { 
 $filedir = str_replace(array(&#39;{y}&#39;,&#39;{m}&#39;,&#39;{d}&#39;),array(date(&#39;Y&#39;,$this->time),date(&#39;m&#39;,$this->time),date(&#39;d&#39;,$this->time)),strtolower($filedir));//用string_replace把{y} {m} {d}几个标签进行替换 
 $dirs = explode(&#39;/&#39;,$filedir); 
 foreach ($dirs as $d) { 
 !empty($d) && $dir .= $d.&#39;/&#39;; 
 !is_dir($dir) && @mkdir($dir,0777); 
}
}
 $this->dir = $dir; 
}

//图片缩略图设置,如果不生成缩略图则不用设置
 //$width : 缩略图宽度 , $height : 缩略图高度 
 function set_thumb ($width = 0, $height = 0) { 
 $this->thumb_width = $width; 
 $this->thumb_height = $height; 
}

//图片水印设置,如果不生成添加水印则不用设置
 //$file : 水印图片 , $pos : 水印位置 , $trans : 水印透明度 
 function set_watermark ($file, $pos = 6, $trans = 80) { 
 $this->watermark_file = $file; 
 $this->watermark_pos = $pos; 
 $this->watermark_trans = $trans; 
}


 function execute() { 
 $files = array(); //成功上传的文件信息 
 $field = $this->field; 
 $keys = array_keys($_FILES[$field][&#39;name&#39;]); 
 foreach ($keys as $key) { 
 if (!$_FILES[$field][&#39;name&#39;][$key]) continue; 

 $fileext = $this->fileext($_FILES[$field][&#39;name&#39;][$key]); //获取文件扩展名 
 $filename = date(&#39;Ymdhis&#39;,$this->time).mt_rand(10,99).&#39;.&#39;.$fileext; //生成文件名 
 $filedir = $this->dir; //附件实际存放目录 
 $filesize = $_FILES[$field][&#39;size&#39;][$key]; //文件大小 

//文件类型不允许
 if (!in_array($fileext,$this->allow_types)) { 
 $files[$key][&#39;name&#39;] = $_FILES[$field][&#39;name&#39;][$key]; 
 $files[$key][&#39;flag&#39;] = -1; 
continue;
}

//文件大小超出
 if ($filesize > $this->maxsize) { 
 $files[$key][&#39;name&#39;] = $_FILES[$field][&#39;name&#39;][$key]; 
 $files[$key][&#39;name&#39;] = $filesize; 
 $files[$key][&#39;flag&#39;] = -2; 
continue;
}

 $files[$key][&#39;name&#39;] = $filename; 
 $files[$key][&#39;dir&#39;] = $filedir; 
 $files[$key][&#39;size&#39;] = $filesize; 

//保存上传文件并删除临时文件
 if (is_uploaded_file($_FILES[$field][&#39;tmp_name&#39;][$key])) { 
move_uploaded_file($_FILES[$field][&#39;tmp_name&#39;][$key],$filedir.$filename);
@unlink($_FILES[$field][&#39;tmp_name&#39;][$key]);
 $files[$key][&#39;flag&#39;] = 1; 

//对图片进行加水印和生成缩略图,这里演示只支持jpg和png(gif生成的话会没了帧的)
 if (in_array($fileext,array(&#39;jpg&#39;,&#39;png&#39;))) { 
 if ($this->thumb_width) { 
 if ($this->create_thumb($filedir.$filename,$filedir.&#39;thumb_&#39;.$filename)) { 
 $files[$key][&#39;thumb&#39;] = &#39;thumb_&#39;.$filename; //缩略图文件名 
}
}
$this->create_watermark($filedir.$filename);
}
}
}

 return $files; 
}

//创建缩略图,以相同的扩展名生成缩略图
 //$src_file : 来源图像路径 , $thumb_file : 缩略图路径 
 function create_thumb ($src_file,$thumb_file) { 
 $t_width = $this->thumb_width; 
 $t_height = $this->thumb_height; 

 if (!file_exists($src_file)) return false; 

 $src_info = getImageSize($src_file); 

//如果来源图像小于或等于缩略图则拷贝源图像作为缩略图,免去操作
 if ($src_info[0] <= $t_width && $src_info[1] <= $t_height) { 
 if (!copy($src_file,$thumb_file)) { 
 return false; 
}
 return true; 
}

//按比例计算缩略图大小
 if (($src_info[0]-$t_width) > ($src_info[1]-$t_height)) { 
 $t_height = ($t_width / $src_info[0]) * $src_info[1]; 
 } else { 
 $t_width = ($t_height / $src_info[1]) * $src_info[0]; 
}

//取得文件扩展名
 $fileext = $this->fileext($src_file); 

 switch ($fileext) { 
 case &#39;jpg&#39; : 
 $src_img = ImageCreateFromJPEG($src_file); break; 
 case &#39;png&#39; : 
 $src_img = ImageCreateFromPNG($src_file); break; 
 case &#39;gif&#39; : 
 $src_img = ImageCreateFromGIF($src_file); break; 
}

//创建一个真彩色的缩略图像
 $thumb_img = @ImageCreateTrueColor($t_width,$t_height); 

//ImageCopyResampled函数拷贝的图像平滑度较好,优先考虑
 if (function_exists(&#39;imagecopyresampled&#39;)) { 
@ImageCopyResampled($thumb_img,$src_img,0,0,0,0,$t_width,$t_height,$src_info[0],$src_info[1]);
 } else { 
@ImageCopyResized($thumb_img,$src_img,0,0,0,0,$t_width,$t_height,$src_info[0],$src_info[1]);
}

//生成缩略图
 switch ($fileext) { 
 case &#39;jpg&#39; : 
 ImageJPEG($thumb_img,$thumb_file); break; 
 case &#39;gif&#39; : 
 ImageGIF($thumb_img,$thumb_file); break; 
 case &#39;png&#39; : 
 ImagePNG($thumb_img,$thumb_file); break; 
}

//销毁临时图像
@ImageDestroy($src_img);
@ImageDestroy($thumb_img);

 return true; 

}

//为图片添加水印
 //$file : 要添加水印的文件 
 function create_watermark ($file) { 

//文件不存在则返回
 if (!file_exists($this->watermark_file) || !file_exists($file)) return; 
 if (!function_exists(&#39;getImageSize&#39;)) return; 

//检查GD支持的文件类型
 $gd_allow_types = array(); 
 if (function_exists(&#39;ImageCreateFromGIF&#39;)) $gd_allow_types[&#39;image/gif&#39;] = &#39;ImageCreateFromGIF&#39;; 
 if (function_exists(&#39;ImageCreateFromPNG&#39;)) $gd_allow_types[&#39;image/png&#39;] = &#39;ImageCreateFromPNG&#39;; 
 if (function_exists(&#39;ImageCreateFromJPEG&#39;)) $gd_allow_types[&#39;image/jpeg&#39;] = &#39;ImageCreateFromJPEG&#39;; 

//获取文件信息
 $fileinfo = getImageSize($file); 
 $wminfo = getImageSize($this->watermark_file); 

 if ($fileinfo[0] < $wminfo[0] || $fileinfo[1] < $wminfo[1]) return; 

 if (array_key_exists($fileinfo[&#39;mime&#39;],$gd_allow_types)) { 
 if (array_key_exists($wminfo[&#39;mime&#39;],$gd_allow_types)) { 

//从文件创建图像
 $temp = $gd_allow_types[$fileinfo[&#39;mime&#39;]]($file); 
 $temp_wm = $gd_allow_types[$wminfo[&#39;mime&#39;]]($this->watermark_file); 

//水印位置
 switch ($this->watermark_pos) { 
 case 1 : //顶部居左 
 $dst_x = 0; $dst_y = 0; break; 
 case 2 ://顶部居中 
 $dst_x = ($fileinfo[0] - $wminfo[0])/2; $dst_y = 0; break; 
 case 3 : //顶部居右 
 $dst_x = $fileinfo[0]; $dst_y = 0; break; 
 case 4 : //底部居左 
 $dst_x = 0; $dst_y = $fileinfo[1]; break; 
 case 5 : //底部居中 
 $dst_x = ($fileinfo[0] - $wminfo[0]) / 2; $dst_y = $fileinfo[1]; break; 
 case 6 : //底部居右 
 $dst_x = $fileinfo[0]-$wminfo[0]; $dst_y = $fileinfo[1]-$wminfo[1]; break; 
 default : //随机 
 $dst_x = mt_rand(0,$fileinfo[0]-$wminfo[0]); $dst_y = mt_rand(0,$fileinfo[1]-$wminfo[1]); 
}

 if (function_exists(&#39;ImageAlphaBlending&#39;)) ImageAlphaBlending($temp_wm,True); //设定图像的混色模式 
 if (function_exists(&#39;ImageSaveAlpha&#39;)) ImageSaveAlpha($temp_wm,True); //保存完整的 alpha 通道信息 

//为图像添加水印
 if (function_exists(&#39;imageCopyMerge&#39;)) { 
ImageCopyMerge($temp,$temp_wm,$dst_x,$dst_y,0,0,$wminfo[0],$wminfo[1],$this->watermark_trans);
 } else { 
ImageCopyMerge($temp,$temp_wm,$dst_x,$dst_y,0,0,$wminfo[0],$wminfo[1]);
}

//保存图片
 switch ($fileinfo[&#39;mime&#39;]) { 
 case &#39;image/jpeg&#39; : 
@imageJPEG($temp,$file);
break;
 case &#39;image/png&#39; : 
@imagePNG($temp,$file);
break;
 case &#39;image/gif&#39; : 
@imageGIF($temp,$file);
break;
}
//销毁零时图像
@imageDestroy($temp);
@imageDestroy($temp_wm);
}
}
}

//获取文件扩展名
 function fileext($filename) { 
 return strtolower(substr(strrchr($filename,&#39;.&#39;),1,10)); 
}
}
?>
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:PHP几种数字左侧自动补0Article suivant:php的ajax分页