ThinkPHP多图上传带缩略图功能

jerry thinkphp 2015年11月19日 收藏
功能简介:
支持多图上传并生成缩略图
可自定义缩略图数量与尺寸
文件默认保存在 “./data/attachment/photo/年月/日/” 目录下

访问地址:http://localhost/upload/photo

如有问题请各位大侠海涵并指正,谢谢~

效果:


首先新建一个控制器文件,命名为:UploadController.class.php,
位置:application\Home\Controller\UploadController.class.php

控制器代码:
  1. <?php

  2. /**
  3.  * 图片上传控制器
  4.  * @author    Jiekii <jiekii@vip.qq.com>
  5.  * @website    http://jiekii.com
  6.  * @date        2014-02-21
  7. **/

  8. namespace Home\Controller;

  9. class UploadController extends HomeController {
  10.     public function photo() {
  11.         if(IS_POST) {
  12.             //设置文件保存目录
  13.             $baseDir = './data/';
  14.             $attachDir = './attachment/photo/'.date('Ym').'/';
  15.             $subDir = date('d');
  16.             $saveName = date('His').strtolower(random(16));

  17.             //上传类配置信息
  18.             $config = array(
  19.                 'maxSize' => 2097152,
  20.                 'exts' => array('jpg', 'jpeg', 'png', 'gif'),
  21.                 'rootPath' => $baseDir,
  22.                 'savePath' => $attachDir,
  23.                 'subName' => array('date', 'd'),
  24.                 'saveName' => $saveName,
  25.                 'hash' => false
  26.             );

  27.             //初始化上传类
  28.             $upload = new \Think\Upload($config);

  29.             //检查是否选择图片
  30.             $inputName = 'photo';
  31.             $total = 0;
  32.             $data = array();
  33.             foreach($_FILES[$inputName] as $key => $value) {
  34.                 foreach($value as $k => $v) {
  35.                     $data[$k][$key] = $v;
  36.                     if($key == 'name' && $v) {
  37.                         $total++;
  38.                     }
  39.                 }
  40.             }

  41.             if(!$total) {
  42.                 $this->error('请先选择要上传的图片!');
  43.             }

  44.             $uploadSuccess = $uploadFailure = 0;
  45.             $result = array();

  46.             //缩略图列表,数组为空则不生成缩略图
  47.             //键为缩略图文件名后缀,例如:20140221abc_a.jpg
  48.             //值为缩略图宽/高
  49.             $thumbList = array(
  50.                 'a' => array(150, 150),
  51.                 'c' => array(250, 250),
  52.                 'm' => array(500, 500)
  53.             );

  54.             //初始化缩略图类
  55.             if(!empty($thumbList)) {
  56.                 $image = new \Think\Image();
  57.             }

  58.             foreach($data as $key => $value) {
  59.                 if(!$value['name']) continue;

  60.                 //如果多图则从第二张开始设置新的文件名
  61.                 if($key >= 1) {
  62.                     $upload->saveName = date('His').strtolower(random(16));
  63.                 }

  64.                 //开始上传
  65.                 $file = $upload->upload(array($inputName => $value));

  66.                 //上传成功
  67.                 if(!empty($file)) {
  68.                     $uploadSuccess++;

  69.                     //缩略图
  70.                     if(!empty($thumbList)) {
  71.                         $path = $baseDir.$file[$inputName]['savepath'].$upload->saveName;
  72.                         $fileExt = $file[$inputName]['ext'];
  73.                         $filePath = $path.'.'.$fileExt;

  74.                         //生成缩略图,按照原图的比例
  75.                         foreach($thumbList as $thumbName => $thumbSize) {
  76.                             if(!$thumbName || empty($thumbSize)) continue;

  77.                             $image->open($filePath);
  78.                             $image->thumb($thumbSize[0], $thumbSize[1])->save($path.'_'.$thumbName.'.'.$fileExt);
  79.                         }
  80.                     }
  81.                 } else {
  82.                     $uploadFailure++;
  83.                 }
  84.                 $result[] = array($upload->getError(), $file);
  85.             }

  86.             //成功提示
  87.             if($uploadSuccess) {
  88.                 $this->success($uploadSuccess.'张图片上传成功!');
  89.             } else {
  90.                 $this->error('上传失败!');
  91.             }
  92.         } else {
  93.             $value = array(
  94.                 'meta_title' => '上传照片'
  95.             );
  96.             $this->assign($value)->display();
  97.         }
  98.     }
  99. }
html代码:
  1. <form action="{:U('upload/photo')}" method="post" enctype="multipart/form-data">
  2.     <p>图片1:<input type="file" name="photo[]"></p>
  3.     <p>图片2:<input type="file" name="photo[]"></p>
  4.     <p>图片3:<input type="file" name="photo[]"></p>
  5.     <p><button type="submit">确定上传</button></p>
  6. </form>