本文讲解了plupload的相关代码,实现了ajax多图同时上传,然后将图片进行缩放,最后显示图片,分享给大家供大家参考,具体内容如下
1、文章视图中调用Plupload
<?= \\common\\widgets\\Plupload::widget([ \'model\'=>$model, \'attribute\'=>\'cover_img\', \'url\'=>\'/file/upload\',//处理文件上传控制器 ])?>
2、\\common\\widgets\\Plupload 组件
<?php namespace common\\widgets; use backend\\assets\\UploadAsset; use yii; use yii\\helpers\\Html; use yii\\base\\Exception; class Plupload extends yii\\bootstrap\\Widget{ public $model; public $attribute; public $name; public $url; private $_html; public function init(){ parent::init(); if(!$this->url){ throw new Exception(\'url参数不能为空\'); } if(!$this->model){ throw new Exception(\'model属性不能为空\'); } if(!$this->attribute){ throw new Exception(\'attribute属性不能为空\'); } } public function run(){ $model = $this->model; $attribute = $this->attribute; $path = $model->$attribute?$model->$attribute:\"/images/noimage.gif\";//显示文章图片或者默认图片 $this->_html.=\'<div class=\"form-group field-article-author\" id=\"container\">\'; $this->_html.=Html::activeLabel($model,$attribute); $this->_html.=Html::activeHiddenInput($model,$attribute,[\'id\'=>\'hidden_input\',\'value\'=>$path]); $this->_html .= \'<div id=\"pickfiles\" style=\"height:50px;min-width:50px;max-width: 300px;overflow: hidden;\"><img height=\"50\" src=\"\'.$path.\'\" /></div>\'; $this->_html.=\'</div> \'; UploadAsset::register($this->view); $this->view->registerJs( \'$(function(){ initCoverImageUploader(\"pickfiles\",\"container\",\"2mb\",\"\'.$this->url.\'\",\"\'.Yii::$app->request->getCsrfToken().\'\"); });\' ); return $this->_html; } }
3、backend\\assets\\UploadAsset
注册相关js
<?php namespace backend\\assets; use yii\\web\\AssetBundle; class UploadAsset extends AssetBundle { public $basePath = \'@webroot\'; public $baseUrl = \'@web\'; public $css = [ ]; public $js = [ \'js/upload.js\' ]; public $depends = [ \'backend\\assets\\PluploadAsset\', ]; }
4、js/upload.js
ajax处理代码
function initCoverImageUploader(buttonId,contatinerId,maxFileSize,url,csrfToken){ var uploader = new plupload.Uploader({ runtimes : \'html5,flash,silverlight,html4\', browse_button :buttonId, // you can pass an id... container: contatinerId, // ... or DOM Element itself url : url, flash_swf_url : \'@vendor/moxiecode/plupload/js/Moxie.swf\', silverlight_xap_url : \'@vendor/moxiecode/plupload//js/Moxie.xap\', filters : { max_file_size : maxFileSize, mime_types: [ {title : \"Image files\", extensions : \"jpg,gif,png\"}, {title : \"Zip files\", extensions : \"zip\"} ] }, multipart_params:{ \'_csrf\':csrfToken }, init: { FilesAdded: function(up, files) { uploader.start(); }, UploadProgress: function(up, file) { $(\'#\'+contatinerId+\' p\').text(\'已上传:\'+file.percent+\'%\'); }, FileUploaded:function (up, file, result) { result = $.parseJSON(result.response); if(result.code == 0){ $(\'#\'+buttonId).html(\'<img src=\"\'+result.path+\'\" height=\"50\" />\'); $(\'#hidden_input\').val(result.path); //console.log(result.message); } }, Error: function(up, err) { document.getElementById(\'console\').appendChild(document.createTextNode(\"\\nError #\" + err.code + \": \" + err.message)); } } }); uploader.init(); }
5、backend\\assets\\PluploadAsset
注册plupload相关资源
<?php namespace backend\\assets; use yii\\web\\AssetBundle; class PluploadAsset extends AssetBundle { public $sourcePath = \'@vendor/moxiecode/plupload\'; public $css = [ ]; public $js = [ \'js/plupload.full.min.js\', ]; public $depends = [ \'yii\\web\\JqueryAsset\', ]; }
6、FileController
控制器调用模型处理上传文件,并且返回结果
class FileController extends BaseController { public function actionUpload(){ Yii::$app->response->format=Response::FORMAT_JSON; $model = New ImageUpload(); $model->fileInputName = \'file\'; if($model->save()){ return [\'code\'=>0,\'message\'=>$model->getMessage(),\'path\'=>$model->getUrlPath()]; }else{ return [\'code\'=>1,\'message\'=>$model->getMessage()]; } } }
7、common\\models\\ImageUpload
模型中对上传文件做了一定的检测,然后将源文件按照一定的比例进行缩放
<?php namespace common\\models; use yii\\base\\Exception; use yii\\helpers\\FileHelper; use yii\\web\\UploadedFile; class ImageUpload extends \\yii\\base\\Object { public $fileInputName = \'file\';//上传表单 file name public $savePath ;//图像保存根位置 public $allowExt = [\'jpg\',\'png\',\'jpeg\',\'gif\',\'bmp\'];//允许上传后缀 public $maxFileSize=1024100000;//最大大小 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\']; private $_uploadFile;//上传文件 private $filePath;//文件路径 private $urlPath;//访问路径 private $res=false;//返回状态 private $message;//返回信息 public function getMessage(){ return $this->message; } public function getUrlPath(){ return $this->urlPath; } public function init(){ if(!$this->fileInputName) throw new Exception(\'fileInputName属性不能为空\'); if(!$this->savePath) $this->savePath = \\Yii::$app->basePath.\'/web/uploads/images\'; $this->savePath = rtrim($this->savePath,\'/\'); if(!file_exists($this->savePath)){ if(! FileHelper::createDirectory($this->savePath)){ $this->message = \'没有权限创建\'.$this->savePath; return false; } } $this->_uploadFile = UploadedFile::getInstanceByName($this->fileInputName); if(!$this->_uploadFile){ $this->message = \'没有找到上传文件\'; return false; } if($this->_uploadFile->error){ $this->message = \'上传失败\'; return false; } if(!in_array($this->extension,$this->allowExt) || !in_array($this->type,$this->allowType)){ $this->message = \'该文件类型不允许上传\'; return false; } if($this->_uploadFile->size> $this->maxFileSize){ $this->message = \'文件过大\'; return false; } $path = date(\'Y-m\',time()); if(!file_exists($this->savePath.\'/\'.$path)){ FileHelper::createDirectory($this->savePath.\'/\'.$path); } $name = substr(\\Yii::$app->security->generateRandomString(),-4,4); $this->filePath = $this->savePath.\'/\'.$path.\'/\'.$this->baseName.\'--\'.$name.\'.\'.$this->extension; $this->urlPath = \'/uploads/images/\'.$path.\'/\'.$this->baseName.\'--\'.$name.\'.\'.$this->extension; } public function save(){ if($this->_uploadFile->saveAs($this->filePath)){ $this->CreateThumbnail($this->filePath);//缩放图片 $this->res = true; }else{ $this->res = false; } if($this->res){ $this->message = $this->_uploadFile->baseName.\'.\'.$this->_uploadFile->extension.\'上传成功\'; }else{ $this->message = $this->_uploadFile->baseName.\'.\'.$this->_uploadFile->extension.\'上传失败\'; } return $this->res; } /** * 获取文件名字 * @return null */ public function getBaseName(){ if($this->_uploadFile){ return $this->_uploadFile->baseName; }else{ return null; } } /** * 返回文件后缀 * @return null */ public function getExtension(){ if($this->_uploadFile){ return $this->_uploadFile->extension; }else{ return null; } } /** * 返回文件类型 * @return mixed */ public function getType(){ if($this->_uploadFile){ return $this->_uploadFile->type; } return null; } /** * 生成保持原图纵横比的缩略图,支持.png .jpg .gif * 缩略图类型统一为.png格式 * $srcFile 原图像文件名称 * $toFile 缩略图文件名称,为空覆盖原图像文件 * $toW 缩略图宽 * $toH 缩略图高 * @return bool */ public static function CreateThumbnail($srcFile, $toFile=\"\", $toW=100, $toH=100) { if ($toFile == \"\") $toFile = $srcFile; $data = getimagesize($srcFile);//返回含有4个单元的数组,0-宽,1-高,2-图像类型,3-宽高的文本描述。 if (!$data) return false; //将文件载入到资源变量im中 switch ($data[2]) //1-GIF,2-JPG,3-PNG { case 1: if(!function_exists(\"imagecreatefromgif\")) return false; $im = imagecreatefromgif($srcFile); break; case 2: if(!function_exists(\"imagecreatefromjpeg\")) return false; $im = imagecreatefromjpeg($srcFile); break; case 3: if(!function_exists(\"imagecreatefrompng\")) return false; $im = imagecreatefrompng($srcFile); break; } //计算缩略图的宽高 $srcW = imagesx($im); $srcH = imagesy($im); $toWH = $toW / $toH; $srcWH = $srcW / $srcH; if ($toWH <= $srcWH) { $ftoW = $toW; $ftoH = (int)($ftoW * ($srcH / $srcW)); } else { $ftoH = $toH; $ftoW = (int)($ftoH * ($srcW / $srcH)); } if (function_exists(\"imagecreatetruecolor\")) { $ni = imagecreatetruecolor($ftoW, $ftoH); //新建一个真彩色图像 if ($ni) { //重采样拷贝部分图像并调整大小 可保持较好的清晰度 imagecopyresampled($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH); } else { //拷贝部分图像并调整大小 $ni = imagecreate($ftoW, $ftoH); imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH); } } else { $ni = imagecreate($ftoW, $ftoH); imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH); } switch ($data[2]) //1-GIF,2-JPG,3-PNG { case 1: imagegif($ni, $toFile); break; case 2: imagejpeg($ni, $toFile); break; case 3: imagepng($ni, $toFile); break; } ImageDestroy($ni); ImageDestroy($im); return $toFile; } }
以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。
本文地址:https://www.stayed.cn/item/24875
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我