欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP 图片上传并生成缩略图类

程序员文章站 2022-04-19 10:48:53
...
  1. /**
  2. * 上传图片
  3. */
  4. class imgUpload{
  5. static protected $a;
  6. protected $formName; //表单名称
  7. protected $directory; //文件上传至目录
  8. protected $maxSize; //最大文件上传大小
  9. protected $canUpload; //是否可以上传
  10. protected $doUpFile; //上传的文件名
  11. protected $sm_File; //缩略图名称
  12. private function __construct($_formName='file', $_directory='./images/uploads/', $_maxSize=1048576){ //1024*1024=1M
  13. //初始化参数
  14. $this->formName = $_formName;
  15. $this->directory = $_directory;
  16. $this->maxSize = $_maxSize;
  17. $this->canUpload = true;
  18. $this->doUpFile = '';
  19. $this->sm_File = '';
  20. }
  21. //判断图片是否属于允许格式内
  22. static public function Type($_formName='file'){
  23. $_type = $_FILES[$_formName]['type'];
  24. switch ($_type){
  25. case 'image/gif':
  26. if (self::$a==NULL)
  27. self::$a = new imgUpload($_formName);
  28. break;
  29. case 'image/pjpeg':
  30. if (self::$a==NULL)
  31. self::$a = new imgUpload($_formName);
  32. break;
  33. case 'image/x-png':
  34. if (self::$a==NULL)
  35. self::$a = new imgUpload($_formName);
  36. break;
  37. default:
  38. self::$a = false;
  39. }
  40. return self::$a;
  41. }
  42. //获取文件大小
  43. public function getSize($_format='K'){
  44. if ($this->canUpload) {
  45. if (0 == $_FILES[$this->formName]['size']) {
  46. $this->canUpload = false;
  47. return $this->canUpload;
  48. break;
  49. }
  50. switch ($_format){
  51. case 'B':
  52. return $_FILES[$this->formName]['size'];
  53. break;
  54. case 'K':
  55. return round($_FILES[$this->formName]['size'] / 1024);
  56. break;
  57. case 'M':
  58. return round($_FILES[$this->formName]['size'] / (1024*1024),2);
  59. break;
  60. }
  61. }
  62. }
  63. //获取文件类型
  64. public function getExt(){
  65. if ($this->canUpload) {
  66. $_name = $_FILES[$this->formName]['name'];
  67. $_nameArr = explode('.',$_name);
  68. $_count = count($_nameArr)-1;
  69. }
  70. return $_nameArr[$_count];
  71. }
  72. //获取文件名称
  73. public function getName(){
  74. if ($this->canUpload) {
  75. return $_FILES[$this->formName]['name'];
  76. }
  77. }
  78. //新建文件名
  79. public function newName(){
  80. return date('YmdHis').rand(0,9);
  81. }
  82. //上传文件
  83. public function upload(){
  84. if ($this->canUpload)
  85. {
  86. $_getSize = $this->getSize('B');
  87. if (!$_getSize)
  88. {
  89. return $_getSize;
  90. break;
  91. }
  92. else
  93. {
  94. $_newName = $this->newName();
  95. $_ext = $this->getExt();
  96. $_doUpload = move_uploaded_file($_FILES[$this->formName]['tmp_name'], $this->directory.$_newName.".".$_ext);
  97. if ($_doUpload)
  98. {
  99. $this->doUpFile = $_newName;
  100. }
  101. return $_doUpload;
  102. }
  103. }
  104. }
  105. //创建缩略图
  106. public function thumb($_dstChar='_m', $_max_len=320){ //$_dstChar:_m , _s
  107. if ($this->canUpload && $this->doUpFile != "") {
  108. $_ext = $this->getExt();
  109. $_srcImage = $this->directory.$this->doUpFile.".".$_ext;
  110. //得到图片信息数组
  111. $_date = getimagesize($_srcImage, &$info);
  112. $src_w = $_date[0]; //源图片宽
  113. $src_h = $_date[1]; //源图片高
  114. $src_max_len = max($src_w, $src_h); //求得长边
  115. $src_min_len = min($src_w, $src_h); //求得短边
  116. $dst_w = ''; //目标图片宽
  117. $dst_h = ''; //目标图片高
  118. //宽高按比例缩放,最长边不大于$_max_len
  119. if ($src_max_len>$_max_len)
  120. {
  121. $percent = $src_min_len / $src_max_len;
  122. if ($src_w == $src_max_len)
  123. {
  124. $dst_w = $_max_len;
  125. $dst_h = $percent * $dst_w;
  126. }
  127. else
  128. {
  129. $dst_h = $_max_len;
  130. $dst_w = $percent * $dst_h;
  131. }
  132. }
  133. else
  134. {
  135. $dst_w = $src_w;
  136. $dst_h = $src_h;
  137. }
  138. //建立缩略图时,源图片的位置
  139. $src_x = '';
  140. $src_y = '';
  141. //判断如果缩略图用于logo,将对其进行裁减
  142. if ('s_' == $_dstChar) {
  143. $src_x = $src_w * 0.10;
  144. $src_y = $src_h * 0.10;
  145. $src_w *= 0.8;
  146. $src_h *= 0.8;
  147. }
  148. //判断图片类型并创建对应新图片
  149. switch ($_date[2]){
  150. case 1:
  151. $src_im = imagecreatefromgif($_srcImage);
  152. break;
  153. case 2:
  154. $src_im = imagecreatefromjpeg($_srcImage);
  155. break;
  156. case 3:
  157. $src_im = imagecreatefrompng($_srcImage);
  158. break;
  159. case 8:
  160. $src_im = imagecreatefromwbmp($_srcImage);
  161. break;
  162. }
  163. //创建一幅新图像
  164. if ($_date[2]==1) { //gif无法应用imagecreatetruecolor
  165. $dst_im = imagecreate($dst_w, $dst_h);
  166. }else {
  167. $dst_im = imagecreatetruecolor($dst_w, $dst_h);
  168. }
  169. //对这副图像进行缩略图copy
  170. // $bg = imagecolorallocate($dst_im,255,255,0);
  171. imagecopyresized($dst_im,$src_im, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h );
  172. //对图片进行抗锯齿操作
  173. imageantialias($dst_im, true);
  174. switch ($_date[2]) {
  175. case 1:
  176. $cr = imagegif($dst_im, $this->directory.$this->doUpFile.$_dstChar.".".$_ext, 100);
  177. break;
  178. case 2:
  179. $cr = imagejpeg($dst_im, $this->directory.$this->doUpFile.$_dstChar.".".$_ext, 100);
  180. break;
  181. case 3://imagepng有问题,所以在这里用imagejpg代替
  182. $cr = imagejpeg($dst_im, $this->directory.$this->doUpFile.$_dstChar.".".$_ext, 100);
  183. break;
  184. }
  185. // $cr = imagejpeg($dst_im, $this->directory.$_dstChar.$this->doUpFile, 90);
  186. if ($cr) {
  187. $this->sm_File = $this->directory.$this->doUpFile.$_dstChar.".".$_ext;
  188. return $this->sm_File;
  189. }else {
  190. return false;
  191. }
  192. }
  193. imagedestroy($dst_im);
  194. imagedestroy($cr);
  195. }
  196. //得到上传后的文件名
  197. public function getUpFile(){
  198. if ($this->doUpFile!='') {
  199. $_ext = $this->getExt();
  200. return $this->doUpFile.".".$_ext;
  201. }else {
  202. return false;
  203. }
  204. }
  205. //得到上传后的文件全路径
  206. public function getFilePatch(){
  207. if ($this->doUpFile!='') {
  208. $_ext = $this->getExt();
  209. return $this->directory.$this->doUpFile.".".$_ext;
  210. }else {
  211. return false;
  212. }
  213. }
  214. //得到缩略图文件全路径
  215. public function getThumb(){
  216. if ($this->sm_File!='') {
  217. return $this->sm_File;
  218. }else {
  219. return false;
  220. }
  221. }
  222. //得到上传文件的路径
  223. public function getDirectory(){
  224. if ($this->directory!='') {
  225. return $this->directory;
  226. }else {
  227. return false;
  228. }
  229. }
  230. }
  231. ?>
复制代码

图片上传, PHP