之前找的一歌layui的项目,里面只有单张图片的上次,多张图片的看似很强大,但是代码较为复杂,涉及到后期上传到第三方服务器的,就会比较难搞。找了好几次,找到了多张图片上传的,特地分享一下
也可以同时选中多张图片
这个是效果,还带删除,调整位置
代码
html代码:
<div class="layui-form-item" style="width:200%;"> <label class="layui-form-label">商品轮播图</label> <div> <ul class="upload-ul clearfix"> <li class="upload-pick"> <div class="webuploader-container clearfix" id="goods_banners"></div> </li> </ul> <p> <button style="margin-left:110px;" type="button" class="layui-btn" id="upload-btn-banners">开始上传</button> </p> </div> </div>js代码
//上传商品轮播图 var goods_banners = ''; var $bannerUpload = $('#goods_banners').diyUpload({ url:'/admin/upload/upload', success:function(resp) { if(resp.error == 0){ goods_banners += resp.url + ','; } }, error:function(err) { }, buttonText : '', accept: { title: "Images", extensions: 'gif,jpg,jpeg,bmp,png' }, thumb:{ width:120, height:90, quality:100, allowMagnify:true, crop:true, type:"image/jpeg" } });另外会引入特定的js文件
/* * jQuery文件上传插件,封装UI,上传处理操作采用Baidu WebUploader; * @Author 黑爪爪; */ (function( $ ) { $.fn.extend({ /* * 上传方法 opt为参数配置; * serverCallBack回调函数 每个文件上传至服务端后,服务端返回参数,无论成功失败都会调用 参数为服务器返回信息; */ diyUpload:function( opt, serverCallBack ) { if ( typeof opt != "object" ) { alert('参数错误!'); return; } var $fileInput = $(this); var $fileInputId = $fileInput.attr('id'); //组装参数; if( opt.url ) { opt.server = opt.url; delete opt.url; } if( opt.success ) { var successCallBack = opt.success; delete opt.success; } if( opt.error ) { var errorCallBack = opt.error; delete opt.error; } //迭代出默认配置 $.each( getOption( '#'+$fileInputId ),function( key, value ){ opt[ key ] = opt[ key ] || value; }); if ( opt.buttonText ) { opt['pick']['label'] = opt.buttonText; delete opt.buttonText; } var webUploader = getUploader( opt ); if ( !WebUploader.Uploader.support() ) { alert( ' 上传组件不支持您的浏览器!'); return false; } //绑定文件加入队列事件; webUploader.on('fileQueued', function( file ) { createBox( $fileInput, file ,webUploader); }); //进度条事件 webUploader.on('uploadProgress',function( file, percentage ){ var $fileBox = $('#fileBox_'+file.id); var $diyBar = $fileBox.find('.diyBar'); $diyBar.show(); percentage = percentage*100; showDiyProgress( percentage.toFixed(2), $diyBar); }); //全部上传结束后触发; webUploader.on('uploadFinished', function(){ $fileInput.next('.parentFileBox').children('.diyButton').remove(); }); //绑定发送至服务端返回后触发事件; webUploader.on('uploadAccept', function( object ,data ){ if ( serverCallBack ) serverCallBack( data ); }); //上传成功后触发事件; webUploader.on('uploadSuccess',function( file, response ){ var $fileBox = $('#fileBox_'+file.id); var $diyBar = $fileBox.find('.diyBar'); $fileBox.removeClass('diyUploadHover'); $diyBar.fadeOut( 1000 ,function(){ $fileBox.children('.diySuccess').show(); }); if ( successCallBack ) { successCallBack( response ); } }); //上传失败后触发事件; webUploader.on('uploadError',function( file, reason ){ var $fileBox = $('#fileBox_'+file.id); var $diyBar = $fileBox.find('.diyBar'); showDiyProgress( 0, $diyBar , '上传失败!' ); var err = '上传失败! 文件:'+file.name+' 错误码:'+reason; if ( errorCallBack ) { errorCallBack( err ); } }); //选择文件错误触发事件; webUploader.on('error', function( code ) { var text = ''; switch( code ) { case 'F_DUPLICATE' : text = '该文件已经被选择了!' ; break; case 'Q_EXCEED_NUM_LIMIT' : text = '上传文件数量超过限制!' ; break; case 'F_EXCEED_SIZE' : text = '文件大小超过限制!'; break; case 'Q_EXCEED_SIZE_LIMIT' : text = '所有文件总大小超过限制!'; break; case 'Q_TYPE_DENIED' : text = '文件类型不正确或者是空文件!'; break; default : text = '未知错误!'; break; } alert( text ); }); return webUploader; } }); //Web Uploader默认配置; function getOption(objId) { /* * 配置文件同webUploader一致,这里只给出默认配置. * 具体参照:http://fex.baidu.com/webuploader/doc/index.html */ return { //按钮容器; pick:{ id:objId, label:"" }, //类型限制; accept:{ title:"Images", extensions:"gif,jpg,jpeg,bmp,png", mimeTypes:"image/*" }, //配置生成缩略图的选项 thumb:{ width:160, height:120, // 图片质量,只有type为`image/jpeg`的时候才有效。 quality:90, // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. allowMagnify:false, // 是否允许裁剪。 crop:true, // 为空的话则保留原有图片格式。 // 否则强制转换成指定的类型。 type:"image/jpeg" }, //文件上传方式 method:"POST", //服务器地址; server:"", //是否已二进制的流的方式发送文件,这样整个上传内容php://input都为文件内容 sendAsBinary:false, // 开起分片上传。 thinkphp的上传类测试分片无效,图片丢失; chunked:true, // 分片大小 chunkSize:512 * 1024, //最大上传的文件数量, 总文件大小,单个文件大小(单位字节); fileNumLimit:50, fileSizeLimit:500000 * 1024, fileSingleSizeLimit:50000 * 1024, }; } //实例化Web Uploader function getUploader( opt ) { return new WebUploader.Uploader( opt ); } //操作进度条; function showDiyProgress( progress, $diyBar, text ) { if ( progress >= 100 ) { progress = progress + '%'; text = text || '上传完成'; } else { progress = progress + '%'; text = text || progress; } var $diyProgress = $diyBar.find('.diyProgress'); $diyProgress.width( progress ).text( text ); } //取消事件; function removeLi ( $li ,file_id ,webUploader) { webUploader.removeFile( file_id ); $li.remove(); } //左移事件; function leftLi ($leftli, $li) { $li.insertBefore($leftli); } //右移事件; function rightLi ($rightli, $li) { $li.insertAfter($rightli); } //创建文件操作div; function createBox( $fileInput, file, webUploader ) { var file_id = file.id; var $parentFileBox = $fileInput.parents(".upload-ul"); var file_len=$parentFileBox.children(".diyUploadHover").length; //添加子容器; var li = '<li id="fileBox_'+file_id+'" class="diyUploadHover"> \ <div class="viewThumb">\ <input type="hidden">\ <div class="diyBar"> \ <div class="diyProgress">0%</div> \ </div> \ <p class="diyControl"><span class="diyLeft"><i></i></span><span class="diyCancel"><i></i></span><span class="diyRight"><i></i></span></p>\ </div> \ </li>'; $parentFileBox.prepend( li ); var $fileBox = $parentFileBox.find('#fileBox_'+file_id); //绑定取消事件; var $diyCancel = $fileBox.find('.diyCancel').one('click',function(){ removeLi( $(this).parents('.diyUploadHover'), file_id, webUploader ); }); //绑定左移事件; $fileBox.find('.diyLeft').one('click',function(){ leftLi($(this).parents('.diyUploadHover').prev(), $(this).parents('.diyUploadHover')); }); //绑定右移事件; $fileBox.find('.diyRight').one('click',function(){ rightLi($(this).parents('.diyUploadHover').next(), $(this).parents('.diyUploadHover') ); }); if ( file.type.split("/")[0] != 'image' ) { var liClassName = getFileTypeClassName( file.name.split(".").pop() ); $fileBox.addClass(liClassName); return; } //生成预览缩略图; webUploader.makeThumb( file, function( error, dataSrc ) { if ( !error ) { $fileBox.find('.viewThumb').append('<img src="'+dataSrc+'" >'); } }); } //获取文件类型; function getFileTypeClassName ( type ) { var fileType = {}; var suffix = '_diy_bg'; fileType['pdf'] = 'pdf'; fileType['ppt'] = 'ppt'; fileType['doc'] = 'doc'; fileType['docx'] = 'doc'; fileType['jpg'] = 'jpg'; fileType['zip'] = 'zip'; fileType['rar'] = 'rar'; fileType['xls'] = 'xls'; fileType['xlsx'] = 'xls'; fileType['txt'] = 'txt'; fileType = fileType[type] || 'ppt'; return fileType+suffix; } })( jQuery );PHP代码
/** * 通用图片上传接口(上传到本地) * @return \think\response\Json */ public function upload() { $config = [ 'size' => 2097152, 'ext' => 'jpg,gif,png,bmp,jpeg' ]; $file = $this->request->file('file'); $upload_path = str_replace('\\', '/', ROOT_PATH . 'public/uploads'); $save_path = '/uploads/'; $info = $file->validate($config)->move($upload_path); if ($info) { $result = [ 'error' => 0, 'url' => str_replace('\\', '/', $save_path . $info->getSaveName()) ]; } else { $result = [ 'error' => 1, 'message' => $file->getError() ]; } return json($result); }希望会帮助到大家