首页 > 作文

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

更新时间:2023-04-07 10:09:06 阅读: 评论:0

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

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

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

plupload有以下功能和特点:

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

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

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

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

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

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

一、案例目录结构

二、index.php控制器方法

<?phpnamespace app\index\controller;u think\controller;u think\db;class index extends controller{  public function index(){    $rooturl = $this->request->root(true); //root域名    $rooturl = explode('index.php',$rooturl)[0];    //模板资源变量分配    foreach (config('tmpl_par_string') as $key => $value) {      $this->view->assign('_'.$key,$rooturl.$value);    }    return $this->fetch();  }  //图片上传方法  public function upload_images(){    ilol暗黑元首出装f($this->request->ispost()){      //接收参数      $images = $this->request->file('file');      //计算md5和sha1散列值,todo::作用避免文件重复上传      $md5 = $images->hash('md5');      $sha1= $images->hash('sha1');      //判断图片文件是否已经上传      $img = db::name('picture')->where(['md5'=>$md5,'sha1'=>$sha1])->find();//我这里是将图片存入数据库,防止重复上传      if(!empty($img)){        return json(['status'=>1,'msg'=>'上传成功','data'=>['img_id'=>$img['id'],'img_url'=>$this->request->root(true).'/'.$img['path']]]);      }el{        // 移动到框架应用根目录/public/uploads/picture/目录下        $imgpath = 'public' . ds . 'uploads' . ds . 'picture';        $info = $images->move(root_path . $imgpath);        $path = 'public/uploads/picture/'.date('ymd',time()).'/'.$info->getfilename();        $data = [          'path' => $path ,          'md5' => $md5 ,          'sha1' => $sha1 ,          'status' => 1 ,          'create_time' => time() ,        ];        if($img_id=db::name('picture')->inrtgetid($data)){          return json(['status'=>1,'msg'=>'上传成功','data'=>['img_id'=>$img_id,'img_url'=>$this->request->root(true).'/'.$path]]);        }el{          return json(['status'=>0,'msg'=>'写入数据库失败']);        }      }    }el{      return ['status'=>0,'msg'=>'非法请求!'];    }  }}

三、index.html页面

<!doctype html><html lang="en"><head>  <meta chart="utf-8">  <title>tp5+plupload图片上传</title></head><body><!-- production --><!--<script type="text/javascript" src="./plupload.full.min.js"></script>--><!-- debug--><script type="text/javascript" src="{$_plupload}/moxie.js">酒柜隔断效果图;</script><scrip炸排骨的做法t type="text/javascript" src="{$_plupload}/plupload.dev.js"></script><script type="text/javascript" src="{$_plupload}/jquery.min.js"></script><style>  ul{    list-style:none;  }  #file-list {overflow: hidden;padding-left: initial;}  #file-list li {    width:160px;    float: left;    height:200px;    position: relative;    height: inherit;    margin-bottom: inherit;  }  #file-list li a {    width:150px;    height:150px;    text-align: center;    display: flex;    align-items: center;    justify-content: center;    margin:0 auto;    border:1px solid #ccc;    padding: 5px 5px 5px 5px;  }  .clo{    background-image: url("{$_plupload}/clo.png");    width: 30px;    height: 30px;    background-size: contain;    position: absolute;    right: 2%;    top: 0;  }  #file-list li a img {max-width:100%;max-height: 100%;}  .progress{    position: absolute;    background-color: rgba(4, 4, 4, 0.53);    color: #fff;    padding: 3px 3px 3px 3px;    border-radius: 10%;  }</style><input type="hidden" id="images_upload" name="images" value=""/><div id="container">  <button class="btn btn-primary" type="button" id="pickfiles" style="height: 30px;line-height: 8px;">选择图片</button>  <button class="btn btn-primary" type="button" id="uploadfiles" style="display: none">开始上传</button>  <ul id="file-list">  </ul></div><script type="text/javascript">  //调用例子  var uploader = new plupload.uploader({    runtimes : 'html5,flash,silverlight,html4',//上传方式顺序优先级    brow_button : 'pickfiles',//选择图片按钮id    container: document.getelementbyid('container'),//容器    url : "{:url('index/upload_images')}",//服务器接口地址    flash_swf_url : "{$_plupload}/moxie.swf",    silverlight_xap_url : "{$_plupload}/moxie.xap",    multi_lection: true,//fal为单图上传,true为多图上传    filters : {      max_file_size : '100mb',//限制文件上传大小      mime_types: [        {title : "image files", extensions : "jpg,gif,png"},//限四川大学锦城学院是几本制文件上传格式      ]    },    init: {      //init事件发生后触发      postinit: function() {        //document.getelementbyid('filelist').innerhtml = '';        document.getelementbyid('uploadfiles').onclick = function() {          uploader.start();          return fal;        };      },      filesadded: function(up, files) {//文件选择之后的触发的方法        var len = len = files.length;        for(var i = 0; i<len; i++){          var file_name = files[i].name; //文件名          var file_size = files[i].size;//文件大小          //构造html来更新ui          //var html = '<li id="file-' + files[i].id +'"><p class="file-name">' + file_name + '(' + plupload.formatsize(file_size) + ')' + '</p><p class="progress"></p></li>';          var html = '<li id="file-' + files[i].id +'"><span class="clo"></span></li>';          $(html).appendto('#file-list');          !function(i){            previewimage(files[i],function(imgsrc){              $('#file-'+files[i].id).append('<a><img src="'+ imgsrc +'" /><span class="progress">12</span></a>');            })          }(i);          $("#uploadfiles").trigger('click');        }        /*plupload.each(files, function(file) {         document.getelementbyid('filelist').innerhtml += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatsize(file.size) + ') <b></b></div>';         });*/      },      uploadprogress: function(up, file) {//上传过程中调用的方法       张纮 //document.getelementbyid(file.id).getelementsbytagname('b')[0].innerhtml = '<span>' + file.percent + "%</span>";        $('#file-'+file.id +" .progress").html(file.percent + "%");      },      fileuploaded : function (up,file,res) {//文件上传完成后        console.log(res.respon);        var data = json.par(res.respon).data;        $('#file-'+file.id).children('.clo').attr('img_id',data.img_id);        var img = $("#images_upload");        var str = img.val();        if(str == ''){          str = data.img_id;        }el{          str += ','+data.img_id;        }        img.val(str);      },      error: function(up, err) {        //document.getelementbyid('console').appendchild(document.createtextnode("\nerror #" + err.code + ": " + err.message));      }    }  });  //plupload中为我们提供了moxie对象  //有关moxie的介绍和说明请看:/d/file/titlepic/api  //file为plupload事件监听函数参数中的file对象,callback为预览图片准备完成的回调函数  function previewimage(file,callback){    if(!file || !/image\//.test(file.type)) return; //确保文件是图片    if(file.type=='image/gif'){ //gif使用filereader进行预览,因为moxie.image只支持jpg和png      var gif = new moxie.file.filereader();      gif.onload = function(){        callback(gif.result);        gif.destroy();        gif = null;      };      gif.readasdataurl(file.getsource());    }el{      var image = new moxie.image.image();      image.onload = function() {        image.downsize( 150, 150 );//先压缩一下要预览的图片,宽300,高300        var imgsrc = image.type=='image/jpeg' ? image.getasdataurl('image/jpeg',80) : image.getasdataurl(); //得到图片src,实质为一个ba64编码的数据        callback && callback(imgsrc); //callback传入的参数为预览图片的url        image.destroy();        image = null;      };      image.load( file.getsource() );    }  }  uploader.init();  //移除图片  $("#file-list").on('click',".clo",function(){    var img_id = $(this).attr("img_id");    var img = $("#images_upload");    var items=img.val().split(",");    var index = items.indexof(img_id);    items.splice(index,1);//删除元素    img.val(items.join(','));    $(this).parent().remove();  });</script></body></html>

  

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

最终效果就是这样了。

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

案例源码:/d/file/titlepic/thinkphp5-plupload (如果对你有帮助,请给个star哦。如果有什么疑问,请留言)

更多关于thinkphp相关内容感兴趣的读者可查看本站专题:《thinkphp入门教程》、《thinkphp模板操作技巧总结》、《thinkphp常用方法总结》、《codeigniter入门教程》、《ci(codeigniter)框架进阶教程》、《zend framework框架入门教程》及《php模板技术总结》。

希望本文所述对大家基于thinkphp框架的php程序设计有所帮助。

本文发布于:2023-04-07 10:09:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/1149d71ce496d69ca4c9948df34a8e44.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】.doc

本文 PDF 下载地址:Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】.pdf

标签:上传   文件   图片   插件
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图