/* fileMaxCount 最大文件数 buttonText 按钮文本 multiple 是否多选 */ (function ($) { $.fn.extend({ uploadImg: function (opt) { var webUploader; //可行性判断 if (!WebUploader.Uploader.support()) { alert('Web Uploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器'); throw new Error('WebUploader does not support the browser you are using.'); } if (typeof opt != "object") { alert('参数错误!'); return; } (function (opt, $uploaderDiv) { // 可能有pedding, ready, uploading, confirm, done. var state = 'pedding', // 添加的文件数量 fileCount = 0, // 优化retina, 在retina下这个值是2 //ratio = window.devicePixelRatio || 1, // 缩略图大小 thumbnailWidth = 700, thumbnailHeight = 700, // 判断浏览器是否支持图片的base64 isSupportBase64 = (function () { var data = new Image(); var support = true; data.onload = data.onerror = function () { if (this.width != 1 || this.height != 1) { support = false; } } data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; return support; })(), // $uploaderDiv = $(this), $uploaderDivId = $uploaderDiv.attr('id'), //图片容器 $queue = $uploaderDiv.find('ul.filelist').length > 0 ? $("ul.filelist") : $('<ul class="filelist"></ul>').appendTo($uploaderDiv), //拖拽区域 $dndDiv = $('<div id="dndArea_' + $uploaderDivId + '" class="placeholder">').appendTo($uploaderDiv), $dndDivId = $dndDiv.attr('id'), //点选区域 $pickerDiv = $(' <div id="filePicker_' + $uploaderDivId + '"></div>').appendTo($dndDiv), $pickerDivId = $pickerDiv.attr('id'); //迭代出默认配置 $.each(getOption('#' + $uploaderDivId), function (key, value) { opt[key] = opt[key] || value; }); opt = $.extend(true, {}, opt, { dnd: '#' + $dndDivId, paste: '#' + $uploaderDivId, //按钮容器; pick: { id: '#' + $pickerDivId, label: '<i class="fa icon-create"></i><p class="filePickerText"><span>添加图片</span><br/>(最多' + (opt.fileMaxCount ? opt.fileMaxCount : opt['fileNumLimit']) + '张)</p>', multiple: true }, }); if (opt.buttonText) { opt['pick']['label'] = opt.buttonText; delete opt.buttonText; } if (!opt.multiple) { opt['pick']['multiple'] = opt.multiple; delete opt.multiple; } if (opt.fileMaxCount) { opt['fileNumLimit'] = opt.fileMaxCount; delete opt.fileMaxCount; } webUploader = WebUploader.create(opt); //if (!WebUploader.Uploader.support()) { // alert(' 上传组件不支持您的浏览器!'); // return false; //} //绑定文件加入队列事件; webUploader.on('fileQueued', function (file) { if (fileCount == opt.fileNumLimit) { return NotifyDanger('上传文件数量超过限制!'); } fileCount++; addFile(file); if (opt.fileNumLimit === fileCount) { setState('ready'); } }); webUploader.on('fileDequeued', function (file) { fileCount--; if (!fileCount || fileCount < opt.fileNumLimit) { setState('pedding'); } removeFile(file); }); // 拖拽时不接受 js, txt 文件。 webUploader.on('dndAccept', function (items) { var denied = false, len = items.length, i = 0, // 修改js类型 unAllowed = 'text/plain;application/javascript '; for (; i < len; i++) { // 如果在列表里面 if (~unAllowed.indexOf(items[i].type)) { denied = true; break; } } return !denied; }); //选择文件错误触发事件; 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 = '文件大小不能超过1M!'; break; case 'Q_EXCEED_SIZE_LIMIT': text = '所有文件总大小超过限制!'; break; case 'Q_TYPE_DENIED': text = '文件类型不正确或者是空文件!'; break; default: text = '未知错误!'; break; } NotifyDanger(text); }); webUploader.on('all', function (type) { switch (type) { case 'uploadFinished': setState('confirm'); break; case 'startUpload': setState('uploading'); break; case 'stopUpload': setState('paused'); break; } }) function setState(val) { if (val === state) { return; } state = val; switch (state) { case 'pedding': $dndDiv.removeClass('element-invisible'); //$queue.hide(); webUploader.refresh(); break; case 'ready': $dndDiv.addClass('element-invisible'); //$queue.show(); webUploader.refresh(); break; } } // 当有文件添加进来时执行,负责view的创建 function addFile(file) { var $li = $('<li id="' + file.id + '">' + //'<p class="title">' + file.name + '</p>' + '<a href="" class="linkA" data-fancybox="group" data-caption=""><p class="imgWrap"></p></a>' + //'<p class="progress"><span></span></p>' + '</li>'), $btns = $('<div class="file-panel">' + '<span class="cancel">删除</span></div>').appendTo($li), $prgress = $li.find('p.progress span'), $wrap = $li.find('p.imgWrap'), $info = $('<p class="error"></p>'), $link = $li.find('a.linkA'); showError = function (code) { switch (code) { case 'exceed_size': text = '文件大小超出'; break; case 'interrupt': text = '上传暂停'; break; default: text = '上传失败,请重试'; break; } $info.text(text).appendTo($li); }; if (file.getStatus() === 'invalid') { showError(file.statusText); } else { // @todo lazyload $wrap.text('预览中'); webUploader.makeThumb(file, function (error, src) { if (error) { $wrap.text('不能预览'); return; } if (isSupportBase64) { var img = $('<img src="' + src + '">'); $wrap.empty().append(img); $link.attr('href', src); } else { $wrap.text("预览出错"); } }, thumbnailWidth, thumbnailHeight); } file.on('statuschange', function (cur, prev) { if (prev === 'progress') { $prgress.hide().width(0); } else if (prev === 'queued') { $li.off('mouseenter mouseleave'); $btns.remove(); } // 成功 if (cur === 'error' || cur === 'invalid') { console.log(file.statusText); showError(file.statusText); } else if (cur === 'interrupt') { showError('interrupt'); } else if (cur === 'queued') { } else if (cur === 'progress') { $info.remove(); $prgress.css('display', 'block'); } else if (cur === 'complete') { $li.append('<span class="success"></span>'); } $li.removeClass('state-' + prev).addClass('state-' + cur); }); $li.on('mouseenter', function () { $btns.stop().animate({ height: 30 }); }); $li.on('mouseleave', function () { $btns.stop().animate({ height: 0 }); }); $btns.on('click', 'span', function () { webUploader.removeFile(file); //if (supportTransition) { // deg = 'rotate(' + file.rotation + 'deg)'; // $wrap.css({ // '-webkit-transform': deg, // '-mos-transform': deg, // '-o-transform': deg, // 'transform': deg // }); //} else { // $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); // // use jquery animate to rotation // // $({ // // rotation: rotation // // }).animate({ // // rotation: file.rotation // // }, { // // easing: 'linear', // // step: function( now ) { // // now = now * Math.PI / 180; // // var cos = Math.cos( now ), // // sin = Math.sin( now ); // // $wrap.css( 'filter', "progid:DXImageTransform.Microsoft.Matrix(M11=" + cos + ",M12=" + (-sin) + ",M21=" + sin + ",M22=" + cos + ",SizingMethod='auto expand')"); // // } // // }); //} }); $li.appendTo($queue); } // 负责view的销毁 function removeFile(file) { var $li = $('#' + file.id); $li.remove(); } })(opt, $(this)) //以下是图片回显的重点内容:先将图片转成File类型,然后通过addFiles把图片添加到队列。参考:https://segmentfault.com/q/1010000007428390 var pictureObj = new Object(); pictureObj.getPictures = function (opt) { if (opt.pictures) { //convertBase64UrlToBlob var getFileBlob = function (url, cb) { var bytes = window.atob(url); //去掉url的头,并转换为byte //处理异常,将ascii码小于0的转换为大于0 var ab = new ArrayBuffer(bytes.length); var ia = new Uint8Array(ab); for (var i = 0; i < bytes.length; i++) { ia[i] = bytes.charCodeAt(i); } cb(new Blob([ab], { type: 'image/jpeg' })); }; var blobToFile = function (blob, name) { blob.lastModifiedDate = new Date(); blob.name = name; return blob; }; var getFileObject = function (filePathOrUrl, cb) { getFileBlob(filePathOrUrl, function (blob) { cb(blobToFile(blob, 'test.jpg')); }); }; var pictures = opt.pictures.split(','); $.each(pictures, function (index, item) { getFileObject(item, function (fileObject) { var wuFile = new WebUploader.Lib.File(WebUploader.guid('rt_'), fileObject); var file = new WebUploader.File(wuFile); webUploader.addFiles(file) }) }) } } return pictureObj; } }) })(jQuery) //Web Uploader默认配置; function getOption(objId) { /* * 配置文件同webUploader一致,这里只给出默认配置. * 具体参照:http://fex.baidu.com/webuploader/doc/index.html */ return { //按钮容器; pick: { id: objId, label: '<i class="fa icon- create"></i><p class="filePickerText"><span>点击添加图片</span></p>',//'<i class="fa icon-create"></i><p class="filePickerText"><span>添加图片</span><br/>(最多20张)</p>', multiple: true }, //类型限制; //accept: { // title: "Images", // extensions: "gif,jpg,jpeg,bmp,png,ico", // mimeTypes: "image/*" //}, //配置生成缩略图的选项 thumb: { 170, height: 150, // 图片质量,只有type为`image/jpeg`的时候才有效。 quality: 70, // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. allowMagnify: false, // 是否允许裁剪。 crop: false, // 为空的话则保留原有图片格式。 // 否则强制转换成指定的类型。 type: "image/jpeg" }, //文件上传方式 method: "POST", tyty //fh; tguty server: "", //是否已二进制的流的方式发送文件,这样整个上传内容php://input都为文件内容 sendAsBinary: false, // 开起分片上传。 thinkphp的上传类测试分片无效,图片丢失; chunked: true, // 分片大小 chunkSize: 512 * 1024, //最大上传的文件数量, 总文件大小,单个文件大小(单位字节); fileNumLimit: 50, fileSizeLimit: 10240 * 1024, fileSingleSizeLimit: 1024 * 1024, }; } ////实例化Web Uploader //function getUploader(opt) { // return new WebUploader.Uploader(opt); //
前台调用方式:
this.init_uploader_picture = function () { //实例化并绑定药品图片 $('#uploader_picture').uploadImg({ fileMaxCount: 1, multiple: false, //pictures: self.form.picture() }).getPictures({ pictures: self.form.picture() }); }
方式二:
/* fileMaxCount 最大文件数 buttonText 按钮文本 multiple 是否多选 pictures base64图片,以逗号隔开 */ (function ($) { $.fn.extend({ diyUpload: function (opt) { //可行性判断 if (!WebUploader.Uploader.support()) { alert('Web Uploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器'); throw new Error('WebUploader does not support the browser you are using.'); } if (typeof opt != "object") { alert('参数错误!'); return; } (function (opt, $uploaderDiv) { // 可能有pedding, ready, uploading, confirm, done. var state = 'pedding', // 添加的文件数量 fileCount = 0, // 优化retina, 在retina下这个值是2 //ratio = window.devicePixelRatio || 1, // 缩略图大小 thumbnailWidth = 700, thumbnailHeight = 700, // 判断浏览器是否支持图片的base64 isSupportBase64 = (function () { var data = new Image(); var support = true; data.onload = data.onerror = function () { if (this.width != 1 || this.height != 1) { support = false; } } data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; return support; })(), // $uploaderDiv = $(this), $uploaderDivId = $uploaderDiv.attr('id'), //图片容器 $queue = $uploaderDiv.find('ul.filelist').length > 0 ? $("ul.filelist") : $('<ul class="filelist"></ul>').appendTo($uploaderDiv), //拖拽区域 $dndDiv = $('<div id="dndArea_' + $uploaderDivId + '" class="placeholder">').appendTo($uploaderDiv), $dndDivId = $dndDiv.attr('id'), //点选区域 $pickerDiv = $(' <div id="filePicker_' + $uploaderDivId + '"></div>').appendTo($dndDiv), $pickerDivId = $pickerDiv.attr('id'); //迭代出默认配置 $.each(getOption('#' + $uploaderDivId), function (key, value) { opt[key] = opt[key] || value; }); opt = $.extend(true, {}, opt, { dnd: '#' + $dndDivId, paste: '#' + $uploaderDivId, //按钮容器; pick: { id: '#' + $pickerDivId, label: '<i class="fa icon-create"></i><p class="filePickerText"><span>添加图片</span><br/>(最多' + (opt.fileMaxCount ? opt.fileMaxCount : opt['fileNumLimit']) + '张)</p>', multiple: true }, }); if (opt.buttonText) { opt['pick']['label'] = opt.buttonText; delete opt.buttonText; } if (opt.multiple) { opt['pick']['multiple'] = opt.multiple; delete opt.multiple; } if (opt.fileMaxCount) { opt['fileNumLimit'] = opt.fileMaxCount; delete opt.fileMaxCount; }
//图片回显的另一种方式
if (opt.pictures) { var pictures = opt.pictures.split(','); for (var i = 0; i < pictures.length; i++) { fileCount++; (function () { //加载原来的图片 var href = "data:image/jpeg;base64," + pictures[i], $li = $('<li id="PIC_WU_FILE_' + i.toString() + '"> <a href="' + href + '" class="linkA" data-fancybox="group" data-caption=""><p class="imgWrap"><img src="' + href + '"/></p></a> </li>'), $btns = $('<div class="file-panel"> <span class="cancel">删除</span> </div>').appendTo($li); $li.appendTo($queue); $li.on('mouseenter', function () { $btns.stop().animate({ height: 30 }); }); $li.on('mouseleave', function () { $btns.stop().animate({ height: 0 }); }); $btns.on('click', 'span', function () { $(this).parent().parent().remove(); fileCount--; if (!fileCount || fileCount < opt.fileNumLimit) { $dndDiv.removeClass('element-invisible'); } }); })(i) } //上传照片数量等于限制数量时,隐藏上传按钮 if (pictures.length > 0 && opt.fileNumLimit && opt.fileNumLimit == fileCount) { $dndDiv.addClass('element-invisible'); } //重新设置限制文件个数参数 if (fileCount > 0) { opt['fileNumLimit'] = opt.fileNumLimit - fileCount; fileCount = 0; } } var webUploader = WebUploader.create(opt); //if (!WebUploader.Uploader.support()) { // alert(' 上传组件不支持您的浏览器!'); // return false; //} //绑定文件加入队列事件; webUploader.on('fileQueued', function (file) { fileCount++; addFile(file); if (opt.fileNumLimit === fileCount) { setState('ready'); } }); webUploader.on('fileDequeued', function (file) { fileCount--; if (!fileCount || fileCount < opt.fileNumLimit) { setState('pedding'); } removeFile(file); }); // 拖拽时不接受 js, txt 文件。 webUploader.on('dndAccept', function (items) { var denied = false, len = items.length, i = 0, // 修改js类型 unAllowed = 'text/plain;application/javascript '; for (; i < len; i++) { // 如果在列表里面 if (~unAllowed.indexOf(items[i].type)) { denied = true; break; } } return !denied; }); //选择文件错误触发事件; 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 = '文件大小不能超过1M!'; break; case 'Q_EXCEED_SIZE_LIMIT': text = '所有文件总大小超过限制!'; break; case 'Q_TYPE_DENIED': text = '文件类型不正确或者是空文件!'; break; default: text = '未知错误!'; break; } NotifyDanger(text); //alert(text); }); webUploader.on('all', function (type) { switch (type) { case 'uploadFinished': setState('confirm'); break; case 'startUpload': setState('uploading'); break; case 'stopUpload': setState('paused'); break; } }) function setState(val) { if (val === state) { return; } state = val; switch (state) { case 'pedding': $dndDiv.removeClass('element-invisible'); //$queue.hide(); webUploader.refresh(); break; case 'ready': $dndDiv.addClass('element-invisible'); //$queue.show(); webUploader.refresh(); break; } } // 当有文件添加进来时执行,负责view的创建 function addFile(file) { var $li = $('<li id="' + file.id + '">' + //'<p class="title">' + file.name + '</p>' + '<a href="" class="linkA" data-fancybox="group" data-caption=""><p class="imgWrap"></p></a>' + //'<p class="progress"><span></span></p>' + '</li>'), $btns = $('<div class="file-panel">' + '<span class="cancel">删除</span></div>').appendTo($li), $prgress = $li.find('p.progress span'), $wrap = $li.find('p.imgWrap'), $info = $('<p class="error"></p>'), $link = $li.find('a.linkA'); showError = function (code) { switch (code) { case 'exceed_size': text = '文件大小超出'; break; case 'interrupt': text = '上传暂停'; break; default: text = '上传失败,请重试'; break; } $info.text(text).appendTo($li); }; if (file.getStatus() === 'invalid') { showError(file.statusText); } else { // @todo lazyload $wrap.text('预览中'); webUploader.makeThumb(file, function (error, src) { if (error) { $wrap.text('不能预览'); return; } if (isSupportBase64) { var img = $('<img src="' + src + '">'); $wrap.empty().append(img); $link.attr('href', src); } else { $wrap.text("预览出错"); } }, thumbnailWidth, thumbnailHeight); } file.on('statuschange', function (cur, prev) { if (prev === 'progress') { $prgress.hide().width(0); } else if (prev === 'queued') { $li.off('mouseenter mouseleave'); $btns.remove(); } // 成功 if (cur === 'error' || cur === 'invalid') { console.log(file.statusText); showError(file.statusText); } else if (cur === 'interrupt') { showError('interrupt'); } else if (cur === 'queued') { } else if (cur === 'progress') { $info.remove(); $prgress.css('display', 'block'); } else if (cur === 'complete') { $li.append('<span class="success"></span>'); } $li.removeClass('state-' + prev).addClass('state-' + cur); }); $li.on('mouseenter', function () { $btns.stop().animate({ height: 30 }); }); $li.on('mouseleave', function () { $btns.stop().animate({ height: 0 }); }); $btns.on('click', 'span', function () { webUploader.removeFile(file); //if (supportTransition) { // deg = 'rotate(' + file.rotation + 'deg)'; // $wrap.css({ // '-webkit-transform': deg, // '-mos-transform': deg, // '-o-transform': deg, // 'transform': deg // }); //} else { // $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); // // use jquery animate to rotation // // $({ // // rotation: rotation // // }).animate({ // // rotation: file.rotation // // }, { // // easing: 'linear', // // step: function( now ) { // // now = now * Math.PI / 180; // // var cos = Math.cos( now ), // // sin = Math.sin( now ); // // $wrap.css( 'filter', "progid:DXImageTransform.Microsoft.Matrix(M11=" + cos + ",M12=" + (-sin) + ",M21=" + sin + ",M22=" + cos + ",SizingMethod='auto expand')"); // // } // // }); //} }); $li.appendTo($queue); } // 负责view的销毁 function removeFile(file) { var $li = $('#' + file.id); $li.remove(); } })(opt, $(this)) } }) })(jQuery) //Web Uploader默认配置; function getOption(objId) { /* * 配置文件同webUploader一致,这里只给出默认配置. * 具体参照:http://fex.baidu.com/webuploader/doc/index.html */ return { //按钮容器; pick: { id: objId, label: '<i class="fa icon- create"></i><p class="filePickerText"><span>点击添加图片</span></p>',//'<i class="fa icon-create"></i><p class="filePickerText"><span>添加图片</span><br/>(最多20张)</p>', multiple: true }, //类型限制; //accept: { // title: "Images", // extensions: "gif,jpg,jpeg,bmp,png,ico", // mimeTypes: "image/*" //}, //配置生成缩略图的选项 thumb: { 170, height: 150, // 图片质量,只有type为`image/jpeg`的时候才有效。 quality: 70, // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. allowMagnify: false, // 是否允许裁剪。 crop: false, // 为空的话则保留原有图片格式。 // 否则强制转换成指定的类型。 type: "image/jpeg" }, //文件上传方式 method: "POST", //服务器地址; server: "", //是否已二进制的流的方式发送文件,这样整个上传内容php://input都为文件内容 sendAsBinary: false, // 开起分片上传。 thinkphp的上传类测试分片无效,图片丢失; chunked: true, // 分片大小 chunkSize: 512 * 1024, //最大上传的文件数量, 总文件大小,单个文件大小(单位字节); fileNumLimit: 50, fileSizeLimit: 10240 * 1024, fileSingleSizeLimit: 1024 * 1024, }; } ////实例化Web Uploader //function getUploader(opt) { // return new WebUploader.Uploader(opt); //}
前台调用方式:
this.init_uploader_picture = function () { //实例化并绑定药品图片 $('#uploader_picture').uploadImg({ fileMaxCount: 1, multiple: false, pictures: self.form.picture() }); }