当前位置:首页 > CMS教程 > 其它CMS > 列表

yii2.0使用Plupload实现带缩放功能的多图上传

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-30 21:53:06 浏览: 评论:0 

本文讲解了plupload的相关代码,实现了ajax多图同时上传,然后将图片进行缩放,最后显示图片,分享给大家供大家参考,具体内容如下。

1、文章视图中调用Plupload

  1. <?= \common\widgets\Plupload::widget([ 
  2.  'model'=>$model, 
  3.  'attribute'=>'cover_img', 
  4.  'url'=>'/file/upload',//处理文件上传控制器 
  5. ])?> 

2、\common\widgets\Plupload 组件

  1. <?php 
  2. namespace common\widgets; 
  3.  
  4. use backend\assets\UploadAsset; 
  5. use yii; 
  6. use yii\helpers\Html; 
  7. use yii\base\Exception; 
  8.  
  9. class Plupload extends yii\bootstrap\Widget{ 
  10.  public $model
  11.  public $attribute
  12.  public $name
  13.  public $url
  14.  
  15.  private $_html
  16.  
  17.  
  18.  public function init(){ 
  19.   parent::init(); 
  20.  if(!$this->url){ 
  21.  throw new Exception('url参数不能为空'); 
  22.  } 
  23.   if(!$this->model){ 
  24.    throw new Exception('model属性不能为空'); 
  25.   } 
  26.   if(!$this->attribute){ 
  27.    throw new Exception('attribute属性不能为空'); 
  28.   } 
  29.  } 
  30.  public function run(){ 
  31.   $model = $this->model; 
  32.   $attribute = $this->attribute; 
  33.   $path = $model->$attribute?$model->$attribute:"/images/noimage.gif";//显示文章图片或者默认图片 
  34.   $this->_html.='<div class="form-group field-article-author" id="container">'
  35.   $this->_html.=Html::activeLabel($model,$attribute); 
  36.   $this->_html.=Html::activeHiddenInput($model,$attribute,['id'=>'hidden_input','value'=>$path]); 
  37.   $this->_html .= '<div id="pickfiles" style="height:50px;min-width:50px;max-width: 300px;overflow: hidden;"><img height="50" src="'.$path.'" /></div>'
  38.   $this->_html.='</div> '
  39.   UploadAsset::register($this->view); 
  40.  $this->view->registerJs( 
  41.  '$(function(){ 
  42.     initCoverImageUploader("pickfiles","container","2mb","'.$this->url.'","'.Yii::$app->request->getCsrfToken().'"); 
  43.    });' 
  44.  ); 
  45.  
  46.   return $this->_html; 
  47.  } 
  48.  

3、backend\assets\UploadAsset

注册相关js

  1. <?php 
  2. namespace backend\assets; 
  3.  
  4. use yii\web\AssetBundle; 
  5.  
  6. class UploadAsset extends AssetBundle 
  7.  public $basePath = '@webroot'
  8.  public $baseUrl = '@web'
  9.  public $css = [ 
  10.  ]; 
  11.  public $js = [ 
  12.   'js/upload.js' 
  13.  ]; 
  14.  public $depends = [ 
  15.   'backend\assets\PluploadAsset'
  16.  ]; 

4、js/upload.js

ajax处理代码

  1. function initCoverImageUploader(buttonId,contatinerId,maxFileSize,url,csrfToken){ 
  2.  var uploader = new plupload.Uploader({ 
  3.   runtimes : 'html5,flash,silverlight,html4'
  4.   browse_button :buttonId, // you can pass an id... 
  5.   container: contatinerId, // ... or DOM Element itself 
  6.   url : url, 
  7.   flash_swf_url : '@vendor/moxiecode/plupload/js/Moxie.swf'
  8.   silverlight_xap_url : '@vendor/moxiecode/plupload//js/Moxie.xap'
  9.  
  10.   filters : { 
  11.    max_file_size : maxFileSize, 
  12.    mime_types: [ 
  13.     {title : "Image files", extensions : "jpg,gif,png"}, 
  14.     {title : "Zip files", extensions : "zip"
  15.    ] 
  16.   }, 
  17.   multipart_params:{ 
  18.    '_csrf':csrfToken 
  19.   }, 
  20.   init: { 
  21.    FilesAdded: function(up, files) { 
  22.     uploader.start(); 
  23.    }, 
  24.    UploadProgress: function(up, file) { 
  25.     $('#'+contatinerId+' p').text('已上传:'+file.percent+'%'); 
  26.    }, 
  27.    FileUploaded:function (up, file, result) { 
  28.     result = $.parseJSON(result.response); 
  29.     if(result.code == 0){ 
  30.      $('#'+buttonId).html('<img src="'+result.path+'" height="50" />'); 
  31.      $('#hidden_input').val(result.path); 
  32.      //console.log(result.message); 
  33.     } 
  34.    }, 
  35.    Error: function(up, err) { 
  36.     document.getElementById('console').appendChild(document.createTextNode("\nError #" + err.code + ": " + err.message)); 
  37.    } 
  38.   } 
  39.  }); 
  40.  
  41.  uploader.init(); 

5、backend\assets\PluploadAsset

注册plupload相关资源

  1. <?php 
  2.  
  3. namespace backend\assets; 
  4.  
  5. use yii\web\AssetBundle; 
  6.  
  7.  
  8. class PluploadAsset extends AssetBundle 
  9.  public $sourcePath = '@vendor/moxiecode/plupload'
  10.  
  11.  public $css = [ 
  12.  ]; 
  13.  public $js = [ 
  14.   'js/plupload.full.min.js'
  15.  ]; 
  16.  public $depends = [ 
  17.   'yii\web\JqueryAsset'
  18.  ]; 

6、FileController

控制器调用模型处理上传文件,并且返回结果

  1. class FileController extends BaseController 
  2.  public function actionUpload(){ 
  3.   Yii::$app->response->format=Response::FORMAT_JSON; 
  4.   $model = New ImageUpload(); 
  5.   $model->fileInputName = 'file'
  6.   if($model->save()){ 
  7.    return ['code'=>0,'message'=>$model->getMessage(),'path'=>$model->getUrlPath()]; 
  8.   }else
  9.    return ['code'=>1,'message'=>$model->getMessage()]; 
  10.   } 
  11.  } 
  12.  

7、common\models\ImageUpload

模型中对上传文件做了一定的检测,然后将源文件按照一定的比例进行缩放

  1. <?php 
  2.  
  3. namespace common\models; 
  4.  
  5. use yii\base\Exception; 
  6. use yii\helpers\FileHelper; 
  7. use yii\web\UploadedFile; 
  8.  
  9. class ImageUpload extends \yii\base\Object 
  10.  public $fileInputName = 'file';//上传表单 file name 
  11.  public $savePath ;//图像保存根位置 
  12.  public $allowExt = ['jpg','png','jpeg','gif','bmp'];//允许上传后缀 
  13.  public $maxFileSize=1024100000;//最大大小 
  14.  public $allowType = ['image/jpeg','image/bmp','image/gif','image/png','image/pjpeg','image/bmp','image/gif','image/x-png','image/pjpeg','image/bmp''image/gif' ,'image/x-png','image/pjpeg','image/bmp','image/gif','image/x-png']; 
  15.  
  16.  private $_uploadFile;//上传文件 
  17.  private $filePath;//文件路径 
  18.  private $urlPath;//访问路径 
  19.  private $res=false;//返回状态 
  20.  private $message;//返回信息 
  21.  
  22.  public function getMessage(){ 
  23.   return $this->message; 
  24.  } 
  25.  public function getUrlPath(){ 
  26.   return $this->urlPath; 
  27.  } 
  28.  
  29.  public function init(){ 
  30.   if(!$this->fileInputName) throw new Exception('fileInputName属性不能为空'); 
  31.  
  32.   if(!$this->savePath) $this->savePath = \Yii::$app->basePath.'/web/uploads/images'
  33.   $this->savePath = rtrim($this->savePath,'/'); 
  34.   if(!file_exists($this->savePath)){ 
  35.    if(! FileHelper::createDirectory($this->savePath)){ 
  36.     $this->message = '没有权限创建'.$this->savePath; 
  37.     return false; 
  38.    } 
  39.   } 
  40.  
  41.   $this->_uploadFile = UploadedFile::getInstanceByName($this->fileInputName); 
  42.   if(!$this->_uploadFile){ 
  43.    $this->message = '没有找到上传文件'
  44.    return false; 
  45.   } 
  46.   if($this->_uploadFile->error){ 
  47.    $this->message = '上传失败'
  48.    return false; 
  49.   } 
  50.  
  51.   if(!in_array($this->extension,$this->allowExt) || !in_array($this->type,$this->allowType)){ 
  52.    $this->message = '该文件类型不允许上传'
  53.    return false; 
  54.   } 
  55.  
  56.   if($this->_uploadFile->size> $this->maxFileSize){ 
  57.    $this->message = '文件过大'
  58.    return false; 
  59.   } 
  60.  
  61.   $path = date('Y-m',time()); 
  62.   if(!file_exists($this->savePath.'/'.$path)){ 
  63.    FileHelper::createDirectory($this->savePath.'/'.$path); 
  64.   } 
  65.   $name = substr(\Yii::$app->security->generateRandomString(),-4,4); 
  66.   $this->filePath = $this->savePath.'/'.$path.'/'.$this->baseName.'--'.$name.'.'.$this->extension; 
  67.   $this->urlPath = '/uploads/images/'.$path.'/'.$this->baseName.'--'.$name.'.'.$this->extension; 
  68.  } 
  69.  
  70.  public function save(){ 
  71.   if($this->_uploadFile->saveAs($this->filePath)){ 
  72.    $this->CreateThumbnail($this->filePath);//缩放图片 
  73.    $this->res = true; 
  74.   }else
  75.    $this->res = false; 
  76.   } 
  77.   if($this->res){ 
  78.    $this->message = $this->_uploadFile->baseName.'.'.$this->_uploadFile->extension.'上传成功'
  79.   }else
  80.    $this->message = $this->_uploadFile->baseName.'.'.$this->_uploadFile->extension.'上传失败'
  81.   } 
  82.   return $this->res; 
  83.  } 
  84.  
  85.  /** 
  86.   * 获取文件名字 
  87.   * @return null 
  88.   */ 
  89.  public function getBaseName(){ 
  90.   if($this->_uploadFile){ 
  91.    return $this->_uploadFile->baseName
  92.   }else
  93.    return null; 
  94.   } 
  95.  } 
  96.  /** 
  97.   * 返回文件后缀 
  98.   * @return null 
  99.   */ 
  100.  public function getExtension(){ 
  101.   if($this->_uploadFile){ 
  102.    return $this->_uploadFile->extension; 
  103.   }else
  104.    return null; 
  105.   } 
  106.  } 
  107.  /** 
  108.   * 返回文件类型 
  109.   * @return mixed 
  110.   */ 
  111.  public function getType(){ 
  112.   if($this->_uploadFile){ 
  113.    return $this->_uploadFile->type; 
  114.   } 
  115.   return null; 
  116.  } 
  117.  
  118.  /** 
  119.   * 生成保持原图纵横比的缩略图,支持.png .jpg .gif 
  120.   * 缩略图类型统一为.png格式 
  121.   * $srcFile  原图像文件名称 
  122.   * $toFile  缩略图文件名称,为空覆盖原图像文件 
  123.   * $toW   缩略图宽 
  124.   * $toH   缩略图高 
  125.   * @return bool 
  126.   */ 
  127.  public static function CreateThumbnail($srcFile$toFile=""$toW=100, $toH=100) 
  128.  { 
  129.   if ($toFile == ""$toFile = $srcFile
  130.  
  131.   $data = getimagesize($srcFile);//返回含有4个单元的数组,0-宽,1-高,2-图像类型,3-宽高的文本描述。 
  132.   if (!$datareturn false; 
  133.   //将文件载入到资源变量im中 
  134.   switch ($data[2]) //1-GIF,2-JPG,3-PNG 
  135.   { 
  136.    case 1: 
  137.     if(!function_exists("imagecreatefromgif")) return false; 
  138.     $im = imagecreatefromgif($srcFile); 
  139.     break
  140.    case 2: 
  141.     if(!function_exists("imagecreatefromjpeg")) return false; 
  142.     $im = imagecreatefromjpeg($srcFile); 
  143.     break
  144.    case 3: 
  145.     if(!function_exists("imagecreatefrompng")) return false; 
  146.     $im = imagecreatefrompng($srcFile); 
  147.     break
  148.   } 
  149.   //计算缩略图的宽高 
  150.   $srcW = imagesx($im); 
  151.   $srcH = imagesy($im); 
  152.   $toWH = $toW / $toH
  153.   $srcWH = $srcW / $srcH
  154.   if ($toWH <= $srcWH) { 
  155.    $ftoW = $toW
  156.    $ftoH = (int)($ftoW * ($srcH / $srcW)); 
  157.   } else { 
  158.    $ftoH = $toH
  159.    $ftoW = (int)($ftoH * ($srcW / $srcH)); 
  160.   } 
  161.  
  162.   if (function_exists("imagecreatetruecolor")) { 
  163.    $ni = imagecreatetruecolor($ftoW$ftoH); //新建一个真彩色图像 
  164.    if ($ni) { 
  165.     //重采样拷贝部分图像并调整大小 可保持较好的清晰度 
  166.     imagecopyresampled($ni$im, 0, 0, 0, 0, $ftoW$ftoH$srcW$srcH); 
  167.    } else { 
  168.     //拷贝部分图像并调整大小 
  169.     $ni = imagecreate($ftoW$ftoH); 
  170.     imagecopyresized($ni$im, 0, 0, 0, 0, $ftoW$ftoH$srcW$srcH); 
  171.    } 
  172.   } else { 
  173.    $ni = imagecreate($ftoW$ftoH); 
  174.    imagecopyresized($ni$im, 0, 0, 0, 0, $ftoW$ftoH$srcW$srcH); 
  175.   } 
  176.  
  177.   switch ($data[2]) //1-GIF,2-JPG,3-PNG 
  178.   { 
  179.    case 1: 
  180.     imagegif($ni$toFile); 
  181.     break
  182.    case 2: 
  183.     imagejpeg($ni$toFile); 
  184.     break
  185.    case 3: 
  186.     imagepng($ni$toFile); 
  187.     break
  188.   } 
  189.   ImageDestroy($ni); 
  190.   ImageDestroy($im); 
  191.   return $toFile
  192.  } 

以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。

Tags: yii2 0 Plupload

分享到: