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

Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-21 18:02:44 浏览: 评论:0 

这篇文章主要介绍了Thinkphp5+plupload实现的图片上传功能,结合具体实例形式分析了thinkPHP5结合plupload实现可支持实时预览的图片上传功能相关操作技巧,需要的朋友可以参考下。

本文实例讲述了Thinkphp5+plupload实现支持实时预览的图片上传功能,分享给大家供大家参考,具体如下:

今天和大家分享一个国外的图片上传插件,这个插件支持分片上传大文件。其中著名的七牛云平台的jssdk就使用了puupload插件,可见这个插件还是相当牛叉的。

这个插件不仅仅支持图片上传,还支持大多数文件的上传,例如视频文件,音频文件,word文件等等,而且大文件都采用分片上传的机制。

Plupload有以下功能和特点:

1、拥有多种上传方式:HTML5、flash、silverlight以及传统的<input type=”file” />。Plupload会自动侦测当前的环境,选择最合适的上传方式,并且会优先使用HTML5的方式。所以你完全不用去操心当前的浏览器支持哪些上传方式,Plupload会自动为你选择最合适的方式。

2、支持以拖拽的方式来选取要上传的文件

3、支持在前端压缩图片,即在图片文件还未上传之前就对它进行压缩

4、可以直接读取原生的文件数据,这样的好处就是例如可以在图片文件还未上传之前就能把它显示在页面上预览

5、支持把大文件切割成小片进行上传,因为有些浏览器对很大的文件比如几G的一些文件无法上传。

下面就介绍一个tp5整合plupload图片上传插件的小案例,希望给大家带来一点小帮助。

一、案例目录结构

Thinkphp5 plupload图片上传

二、Index.php控制器方法

  1. <?php 
  2. namespace app\index\controller; 
  3. use think\Controller; 
  4. use think\Db; 
  5. class Index extends Controller{ 
  6.   public function index(){ 
  7.     $rootUrl = $this->request->root(true); //ROOT域名 
  8.     $rootUrl = explode('index.php',$rootUrl)[0]; 
  9.     //模板资源变量分配 
  10.     foreach (config('TMPL_PARSE_STRING'as $key => $value) { 
  11.       $this->view->assign('_'.$key,$rootUrl.$value); 
  12.     } 
  13.     return $this->fetch(); 
  14.   } 
  15.   //图片上传方法 
  16.   public function upload_images(){ 
  17.     if($this->request->isPost()){ 
  18.       //接收参数 
  19.       $images = $this->request->file('file'); 
  20.       //计算md5和sha1散列值,TODO::作用避免文件重复上传 
  21.       $md5 = $images->hash('md5'); 
  22.       $sha1$images->hash('sha1'); 
  23.       //判断图片文件是否已经上传 
  24.       $img = Db::name('picture')->where(['md5'=>$md5,'sha1'=>$sha1])->find();//我这里是将图片存入数据库,防止重复上传 
  25.       if(!emptyempty($img)){ 
  26.         return json(['status'=>1,'msg'=>'上传成功','data'=>['img_id'=>$img['id'],'img_url'=>$this->request->root(true).'/'.$img['path']]]); 
  27.       }else
  28.         // 移动到框架应用根目录/public/uploads/picture/目录下 
  29.         $imgPath = 'public' . DS . 'uploads' . DS . 'picture'
  30.         $info = $images->move(ROOT_PATH . $imgPath); 
  31.         $path = 'public/uploads/picture/'.date('Ymd',time()).'/'.$info->getFilename(); 
  32.         $data = [ 
  33.           'path' => $path , 
  34.           'md5' => $md5 , 
  35.           'sha1' => $sha1 , 
  36.           'status' => 1 , 
  37.           'create_time' => time() , 
  38.         ]; 
  39.         if($img_id=Db::name('picture')->insertGetId($data)){ 
  40.           return json(['status'=>1,'msg'=>'上传成功','data'=>['img_id'=>$img_id,'img_url'=>$this->request->root(true).'/'.$path]]); 
  41.         }else
  42.           return json(['status'=>0,'msg'=>'写入数据库失败']); 
  43.         } 
  44.       } 
  45.     }else
  46.       return ['status'=>0,'msg'=>'非法请求!']; 
  47.     } 
  48.   } 

三、index.html页面

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.   <meta charset="UTF-8"
  5.   <title>tp5+plupload图片上传</title> 
  6. </head> 
  7. <body> 
  8. <!-- production --> 
  9. <!--<script type="text/javascript" src="./plupload.full.min.js"></script>--> 
  10. <!-- debug--> 
  11. <script type="text/javascript" src="{$_plupload}/moxie.js"></script> 
  12. <script type="text/javascript" src="{$_plupload}/plupload.dev.js"></script> 
  13. <script type="text/javascript" src="{$_plupload}/jquery.min.js"></script> 
  14. <style> 
  15.   ul{ 
  16.     list-style:none; 
  17.   } 
  18.   #file-list {overflow: hidden;padding-left: initial;} 
  19.   #file-list li { 
  20.     width:160px; 
  21.     float: left; 
  22.     height:200px; 
  23.     position: relative; 
  24.     height: inherit; 
  25.     margin-bottom: inherit; 
  26.   } 
  27.   #file-list li a { 
  28.     width:150px; 
  29.     height:150px; 
  30.     text-align: center; 
  31.     display: flex; 
  32.     align-items: center; 
  33.     justify-content: center; 
  34.     margin:0 auto; 
  35.     border:1px solid #ccc; 
  36.     padding: 5px 5px 5px 5px; 
  37.   } 
  38.   .close{ 
  39.     background-image: url("{$_plupload}/close.png"); 
  40.     width: 30px; 
  41.     height: 30px; 
  42.     background-size: contain; 
  43.     position: absolute; 
  44.     right: 2%; 
  45.     top: 0; 
  46.   } 
  47.   #file-list li a img {max-width:100%;max-height: 100%;} 
  48.   .progress{ 
  49.     position: absolute; 
  50.     background-color: rgba(4, 4, 4, 0.53); 
  51.     color: #fff; 
  52.     padding: 3px 3px 3px 3px; 
  53.     border-radius: 10%; 
  54.   } 
  55. </style> 
  56. <input type="hidden" id="images_upload" name="images" value=""/> 
  57. <div id="container"
  58.   <button class="btn btn-primary" type="button" id="pickfiles" style="height: 30px;line-height: 8px;">选择图片</button> 
  59.   <button class="btn btn-primary" type="button" id="uploadfiles" style="display: none">开始上传</button> 
  60.   <ul id="file-list"
  61.   </ul> 
  62. </div> 
  63. <script type="text/javascript"
  64.   //调用例子 
  65.   var uploader = new plupload.Uploader({ 
  66.     runtimes : 'html5,flash,silverlight,html4',//上传方式顺序优先级 
  67.     browse_button : 'pickfiles',//选择图片按钮id 
  68.     container: document.getElementById('container'),//容器 
  69.     url : "{:url('Index/upload_images')}",//服务器接口地址 
  70.     flash_swf_url : "{$_plupload}/Moxie.swf"
  71.     silverlight_xap_url : "{$_plupload}/Moxie.xap"
  72.     multi_selection: true,//false为单图上传,true为多图上传 
  73.     filters : { 
  74.       max_file_size : '100mb',//限制文件上传大小 
  75.       mime_types: [ 
  76.         {title : "Image files", extensions : "jpg,gif,png"},//限制文件上传格式 
  77.       ] 
  78.     }, 
  79.     init: { 
  80.       //init事件发生后触发 
  81.       PostInit: function() { 
  82.         //document.getElementById('filelist').innerHTML = ''; 
  83.         document.getElementById('uploadfiles').onclick = function() { 
  84.           uploader.start(); 
  85.           return false; 
  86.         }; 
  87.       }, 
  88.       FilesAdded: function(up, files) {//文件选择之后的触发的方法 
  89.         var len = len = files.length; 
  90.         for(var i = 0; i<len; i++){ 
  91.           var file_name = files[i].name; //文件名 
  92.           var file_size = files[i].size;//文件大小 
  93.           //构造html来更新UI 
  94.           //var html = '<li id="file-' + files[i].id +'"><p class="file-name">' + file_name + '(' + plupload.formatSize(file_size) + ')' + '</p><p class="progress"></p></li>'; 
  95.           var html = '<li id="file-' + files[i].id +'"><span class="close"></span></li>'
  96.           $(html).appendTo('#file-list'); 
  97.           !function(i){ 
  98.             previewImage(files[i],function(imgsrc){ 
  99.               $('#file-'+files[i].id).append('<a><img src="'+ imgsrc +'" /><span class="progress">12</span></a>'); 
  100.             }) 
  101.           }(i); 
  102.           $("#uploadfiles").trigger('click'); 
  103.         } 
  104.         /*plupload.each(files, function(file) { 
  105.          document.getElementById('filelist').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b></div>'; 
  106.          });*/ 
  107.       }, 
  108.       UploadProgress: function(up, file) {//上传过程中调用的方法 
  109.         //document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>"; 
  110.         $('#file-'+file.id +" .progress").html(file.percent + "%"); 
  111.       }, 
  112.       FileUploaded : function (up,file,res) {//文件上传完成后 
  113.         console.log(res.response); 
  114.         var data = JSON.parse(res.response).data; 
  115.         $('#file-'+file.id).children('.close').attr('img_id',data.img_id); 
  116.         var img = $("#images_upload"); 
  117.         var str = img.val(); 
  118.         if(str == ''){ 
  119.           str = data.img_id; 
  120.         }else
  121.           str += ','+data.img_id; 
  122.         } 
  123.         img.val(str); 
  124.       }, 
  125.       Error: function(up, err) { 
  126.         //document.getElementById('console').appendChild(document.createTextNode("\nError #" + err.code + ": " + err.message)); 
  127.       } 
  128.     } 
  129.   }); 
  130.   //plupload中为我们提供了mOxie对象 
  131.   //有关mOxie的介绍和说明请看:https://github.com/moxiecode/moxie/wiki/API 
  132.   //file为plupload事件监听函数参数中的file对象,callback为预览图片准备完成的回调函数 
  133.   function previewImage(file,callback){ 
  134.     if(!file || !/image\//.test(file.type)) return; //确保文件是图片 
  135.     if(file.type=='image/gif'){ //gif使用FileReader进行预览,因为mOxie.Image只支持jpg和png 
  136.       var gif = new moxie.file.FileReader(); 
  137.       gif.onload = function(){ 
  138.         callback(gif.result); 
  139.         gif.destroy(); 
  140.         gif = null; 
  141.       }; 
  142.       gif.readAsDataURL(file.getSource()); 
  143.     }else
  144.       var image = new moxie.image.Image(); 
  145.       image.onload = function() { 
  146.         image.downsize( 150, 150 );//先压缩一下要预览的图片,宽300,高300 
  147.         var imgsrc = image.type=='image/jpeg' ? image.getAsDataURL('image/jpeg',80) : image.getAsDataURL(); //得到图片src,实质为一个base64编码的数据 
  148.         callback && callback(imgsrc); //callback传入的参数为预览图片的url 
  149.         image.destroy(); 
  150.         image = null; 
  151.       }; 
  152.       image.load( file.getSource() ); 
  153.     } 
  154.   } 
  155.   uploader.init(); 
  156.   //移除图片 
  157.   $("#file-list").on('click',".close",function(){ 
  158.     var img_id = $(this).attr("img_id"); 
  159.     var img = $("#images_upload"); 
  160.     var items=img.val().split(","); 
  161.     var index = items.indexOf(img_id); 
  162.     items.splice(index,1);//删除元素 
  163.     img.val(items.join(',')); 
  164.     $(this).parent().remove(); 
  165.   }); 
  166. </script> 
  167. </body> 
  168. </html> 

Thinkphp5 plupload图片上传

如果想研究插件源码的朋友,可以看这个文件,其中大部分都已经注释了。

Thinkphp5 plupload图片上传

最终效果就是这样了。

Thinkphp5 plupload图片上传

如果对tp5不太熟悉的朋友,建议直接配置虚拟域名,将项目目录绑定到/tp5/public/目录。

Tags: Thinkphp5 plupload图片上传

分享到: