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

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

PHP中文网
Freigeben: 2016-05-25 17:12:18
Original
1201 Leute haben es durchsucht

可以用{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)); 
}
}
?>
Nach dem Login kopieren
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage