/** * Created by Lynn on 2016/3/9. * 本上传为上传到本地 */ ; (function () { window.up = []; // 检查是否引入了jquery库 if (typeof jQuery == 'undefined') return false; // 检查是否支持File等对象 if (!window.File || !window.FileReader || !window.FileList || !window.Blob || !File.prototype.slice) return false; // 处理不同浏览器中的File、Blob对象分割方法slice if ((typeof File == 'undefined')) return false; if (!File.prototype.slice) { if (File.prototype.webkitSlice) File.prototype.slice = File.prototype.webkitSlice; else if (File.prototype.mozSlice) File.prototype.slice = File.prototype.mozSlice; } return true; })() && (function ($) { /** * 工具方法集 */ var util = g = { rotl: function (a, b) { return a << b | a >>> 32 - b; }, rotr: function (a, b) { return a << 32 - b | a >>> b; }, endian: function (a) { if (a.constructor == Number) return g.rotl(a, 8) & 16711935 | g.rotl(a, 24) & 4278255360; for (var b = 0; b < a.length; b++) a[b] = g.endian(a[b]); return a; }, randomBytes: function (a) { for (var b = []; a > 0; a--) b.push(Math.floor(Math.random() * 256)); return b; }, bytesToWords: function (a) { for (var b = [], c = 0, d = 0; c < a.length; c++, d += 8) b[d >>> 5] |= a[c] << 24 - d % 32; return b; }, wordsToBytes: function (a) { for (var b = [], c = 0; c < a.length * 32; c += 8) b.push(a[c >>> 5] >>> 24 - c % 32 & 255); return b; }, bytesToHex: function (a) { for (var b = [], c = 0; c < a.length; c++) b.push((a[c] >>> 4).toString(16)), b.push((a[c] & 15).toString(16)); return b.join(""); }, hexToBytes: function (a) { for (var b = [], c = 0; c < a.length; c += 2) b.push(parseInt(a.substr(c, 2), 16)); return b; }, bytesToBase64: function (a) { if (typeof btoa == "function") return btoa(f.bytesToString(a)); for (var b = [], c = 0; c < a.length; c += 3) for (var d = a[c] << 16 | a[c + 1] << 8 | a[c + 2], e = 0; e < 4; e++) c * 8 + e * 6 <= a.length * 8 ? b.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(d >>> 6 * (3 - e) & 63)) : b.push("="); return b.join(""); }, base64ToBytes: function (a) { if (typeof atob == "function") return f.stringToBytes(atob(a)); for (var a = a.replace(/[^A-Z0-9+/]/ig, ""), b = [], c = 0, d = 0; c < a.length; d = ++c % 4) d != 0 && b.push(("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c - 1)) & Math.pow(2, -2 * d + 8) - 1) << d * 2 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(a.charAt(c)) >>> 6 - d * 2); return b; } }; /** * sha1算法处理 * * @param (Array){block}分块数组 * @param (Array){hash}当前计算出的hash数组 */ var sha1 = function (block, hash) { var words = []; var count_parts = 16; var h0 = hash[0], h1 = hash[1], h2 = hash[2], h3 = hash[3], h4 = hash[4]; for (var i = 0; i < block.length; i += count_parts) { var th0 = h0, th1 = h1, th2 = h2, th3 = h3, th4 = h4; for (var j = 0; j < 80; j++) { if (j < count_parts) words[j] = block[i + j] | 0; else { var n = words[j - 3] ^ words[j - 8] ^ words[j - 14] ^ words[j - count_parts]; words[j] = (n << 1) | (n >>> 31); } var f, k; if (j < 20) { f = (h1 & h2 | ~h1 & h3); k = 1518500249; } else if (j < 40) { f = (h1 ^ h2 ^ h3); k = 1859775393; } else if (j < 60) { f = (h1 & h2 | h1 & h3 | h2 & h3); k = -1894007588; } else { f = (h1 ^ h2 ^ h3); k = -899497514; } var t = ((h0 << 5) | (h0 >>> 27)) + h4 + (words[j] >>> 0) + f + k; h4 = h3; h3 = h2; h2 = (h1 << 30) | (h1 >>> 2); h1 = h0; h0 = t; } h0 = (h0 + th0) | 0; h1 = (h1 + th1) | 0; h2 = (h2 + th2) | 0; h3 = (h3 + th3) | 0; h4 = (h4 + th4) | 0; } return [h0, h1, h2, h3, h4]; } /** * 通过字符数组对应的Unicode数组得到相应的hash值 * * @param (Uint8Array){charCodeArr}字符数组对应的Unicode数组,例如:[97,98,99] * @param (Function){method}计算hash所用的加密方法,如sha1等 * @param (Number)buffer分块处理的块大小 * @return (Array){hash}hash数组 */ var getHash = function (charCodeArr, method, buffer) { (buffer && buffer > 0) || (buffer = 1024 * 16 * 64); // 处理默认的buffer var hash = [1732584193, -271733879, -1732584194, 271733878, -1009589776]; var len = charCodeArr.length; var start = 0; var end = buffer - 1; var block; while (start + 1 <= len) { end = Math.min(end, len - 1); block = util.bytesToWords(charCodeArr.subarray(start, end + 1)); if (end === len - 1) { var bTotal, bLeft, bTotalH, bTotalL; bTotal = len * 8; bLeft = (end - start + 1) * 8; bTotalH = Math.floor(bTotal / 0x100000000); bTotalL = bTotal & 0xFFFFFFFF; // Padding block[bLeft >>> 5] |= 0x80 << (24 - bLeft % 32); block[((bLeft + 64 >>> 9) << 4) + 14] = bTotalH; block[((bLeft + 64 >>> 9) << 4) + 15] = bTotalL; } hash = method(block, hash); start += buffer; end += buffer; } return hash; } /** * 通过字符数组对应的Unicode数组得到sha1值 * * @param (Uint8Array){charCodeArr}字符数组对应的Unicode数组,例如:[97,98,99] * @param (Number){buffer}分块处理的块大小 * @return (String){sha1}sha1值 */ var getSha1 = function (charCodeArr, buffer) { var hash = getHash(charCodeArr, sha1, buffer); return util.bytesToHex(hash); } /** * 获取字符串的sha1 * * @param (String){str}字符串 * @return (String){sha1}字符串对应的sha1值 */ var getSha1FromStr = function (str) { var len = str.length; var b = [len]; for (var i = 0; i < len; i++) { b[i] = str.charCodeAt(i); } return getSha1(new Uint8Array(b), 10240); } /** * 获取文件的sha1 * * @param (File){file}文件对象 * @return (String){sha1}sha1值 */ var getSha1FromFile = function (file, callback) { var reader = new FileReader(); try { reader.readAsArrayBuffer(file); } catch (e) { reader.readAsArrayBuffer(file.source.source); } reader.onload = function (e) { var u8Arr = new Uint8Array(e.target.result); var sha1 = jQuery.hash.getSha1(u8Arr, 10240); file.sha1 = sha1; // console.log(file); callback(e, sha1); } }; $.hash = { util: util, getSha1: getSha1, getSha1FromStr: getSha1FromStr, getSha1FromFile: getSha1FromFile }; })(jQuery); (function ($, window, document, undefined) { "use strict"; $.fn.imageGroup = function (options) { return this.each(function () { new ImageGroup(this, $.extend({}, $.fn.imageGroup.defaults, options)); }); };//用以一开始生成页面缩略图 // Defaults $.fn.imageGroup.defaults = { multi: !1, // 是否多图 editable: !0, // 图片名称是否可编辑 moveable: !0, //图片是否能移动 deletable: !0, //图片是否可删除 upload: !0, // 是否允许上传图片 uploadText: '', uploadAction: UPLOAD_IMG, //图片上传接口 server: !1, //是否允许从服务器端选择图片 serverText: '', thumb_width: 160, thumb_height: 120, defaultName: '上传图片', compress: false, maxPhoto: 100, overSize: 100000 }; var uploaded = {}; function getUrlFile(url){ var tmp= new Array(); tmp=url.split("/"); return tmp[tmp.length-1]; } // WebUploader.Deferred() // 在文件开始发送前做些异步操作。 // WebUploader会等待此异步操作完成后,开始发送文件。 WebUploader.Uploader.register({//此为类似函数原型,让每个调用webuploader插件的函数都调用里面的步骤 "before-send-file": "beforeSendFile", 'before-send': 'beforeSend' }, { beforeSendFile: function (file) { if (file.size > 102400) {//文件少于 100k 时直接让他上传 var task = new $.Deferred(), callback = function (daa, sha1) { if (typeof uploaded[sha1] == 'undefined') { task.resolve(); } else { CallUploadSuccess(file, uploaded[sha1]); task.reject(); } }; $.when(sha1File(file.source.source, callback)) .done(function (data, e) { }) .fail(function () { toast('网络出现错误') }); return $.when(task); } }, beforeSend: function (file) { if (file.file.size > 102400) {//文件少于 100k 时直接让他上传 var task = new $.Deferred(), sha1 = file.file.source.source.filename; if (typeof uploaded[sha1] == 'undefined') { $.ajax({ type: "GET", url: getUrl("upload/hash?hash=" + sha1), dataType: 'json' }).then(function (rs, textStatus, jqXHR) { task.resolve(); // if (rs.state == 1) {//已存在的直接算作秒传 // uploaded[sha1] = rs; // CallUploadSuccess(file, uploaded[sha1]); // task.reject();//停止上传 // } else {//没有该图片 // task.resolve(); // } }, function (jqXHR, textStatus, errorThrown) {//任何形式的验证失败,都触发重新上传 task.resolve(); }); return $.when(task); } else { CallUploadSuccess(file, uploaded[sha1]);//移除加载 并添加控件 task.reject();//停止上传 } } } }); function CallUploadSuccess(file, rs, options) {//从服务器成功拿回数据 file = file.file || file; var item = $('#' + file.id), tr = $('#' + file.id +'tr'); if(tr){//资源管理处处理 var res = rs.content;//此处应该无论组件形式还是资源管理形式都会调用,不要在此处阻止上传过程 // toast('文件 ' + file.name + ' 已上传过'); // tr.remove(); // local.removeFile(file.id, true); // return; } //组件处处理 if (!options) { var element = item.closest('.vc-img-edit'); options = element.data('web-uploader-options'); } if (1 != rs.state) { // 不为1 则为上传错误 if (rs != '') { $('

上传错误

').appendTo(item.find('.vc-img-img')); return; } else { return; } } item.addClass('upload-state-success'); var source = rs.content, src, img; if (options && typeof options.size != 'undefined') { src = SOSO.getImageUrl(source, options.size); } else { src = source.origin + source.path; } img = item.find('img').attr('src', src); CallSetValues(item, {name: source.name || source.filename, path: source.path}, options); if (options && options.uploadSuccess) { options.uploadSuccess.call(item.get(0), file, source); } item.find('.vc-img-loading').remove(); if(rs){ } } function CallSetValues(item, values, options) { if(options){ values = values || {}; if (options && options.editable) CallSetText(item, values.title || values.name || '', values.desc || ''); values.update = 1; $.each(values, function () { var k = arguments[0], v = arguments[1], n = 'field' + k.substring(0, 1).toUpperCase() + k.substring(1), ipt; if (options && options[n]) { ipt = item.find("input[name='" + options[n] + "']"); if (!ipt.length) { ipt = $('').appendTo(item); } ipt.val(v); } }); item.data('soso.images', values); if (options && typeof options.setValues == 'function') { options.setValues(options, item, values); } } } function CallSetText(item, title, desc) { var h6 = item.find('h6'); if (!h6.length) { h6 = $('
').appendTo(item); } h6.text(title); } function ImageGroup(element, options) { if (!arguments.length) { return; } var img_uploaded_num = 0, cls_item = 'vc-img-item', cls_uploaded = 'upload-state-done', cls_success = 'upload-state-success', btns, uploadItem, uploader, fields = null, deleteIdsInput, _server; element = $(element).addClass('vc-img-edit'); $.extend(options, element.data()); element.data('web-uploader-options', options); render(); function render() { var items = element.find('.' + cls_item), i = 0; img_uploaded_num = items.length; for (; i < img_uploaded_num; i++) { var item = items.eq(i), img = item.find('img'); if (img.length) { renderImg(item, img); } else if (!options.multi && 0 == i) {//渲染只允许单选的按钮 renderBtns(item); } if (options.itemWidth > 0) ct.css({width: options.itemWidth, 'max-width': 'none'}); } if (options.multi || 0 == img_uploaded_num) renderItem(); if (options.fixedHeight > 0) { element.addClass('vc-img-fixed-height'); } element.on('click', function (e) { var el = $(e.target), func = el.data('func'), item; if (!func && el.is('.fa')) { el = el.parent(); func = el.data('func'); } if (func) { item = el.parent().parent().parent() switch (func) { case 'edit': edit(item); break; case 'del': del(item); break; case 'leftMove': move(item, 'left'); break; case 'rightMove': move(item, 'right'); break; case 'server': server(el.parent().parent()); break; } } }); element.on('dblclick', function (e) {//给每个 img 添加双击查看原图弹窗 var el = $(e.target); if (el.is('img')) { if ($.isFunction(options.dblclick)) { options.dblclick(element, el); } else { top.lightBox(el, {src: SOSO.getImageUrl(el.attr('src'), !1)}); } } else if (el.is('h6')) { if (options.editable) { edit(element); } } }); }//渲染 function renderBtns(item) {//渲染五个上传按钮 if (btns) { btns.show(); return; } uploadItem = item; var cls = options.upload && options.server ? 'vc-img-btns' : 'vc-img-btn';//判断是否允许使用上传功能 btns = $('
').prependTo(item.addClass('vc-img-upload')); if (options.upload) { var btn = $('
' + options.uploadText + '
').appendTo(btns); if (options.fixedHeight > 0) { btn.height(options.fixedHeight).addClass('btn-fixed-height'); } renderUploader(item, btn); } if (options.server) btns.append($('' + options.serverText + ''));//判断是否允许使用在线选择功能 //window.setTimeout(function(){btns.show()}, 100); } function renderImg(item, img) { var ct = $('
').prependTo(item); item.addClass(cls_uploaded); if (typeof img == 'string') { img = $(''); item.addClass(cls_success); } else if (typeof img == 'object' && img.source) { img = $('

等待上传

'); } if (options.fixedHeight > 0 && img.is('img')) { img.height(options.fixedHeight); } ct.append(img); var span = $('').appendTo(ct); if (options.editable) { span.append(''); } if (options.deletable) { span.append(''); } if (options.multi && options.moveable) { span.append(''); span.append(''); } return img; } function renderItem(file, item) { var l = element.find('.' + cls_item).length, ct = $('
'); if (item) { item.before(ct); } else { element.append(ct); } if (options.itemWidth > 0) ct.css({width: options.itemWidth, 'max-width': 'none'}); if (!file) { renderBtns(ct);//渲染多选按钮 setText(ct, options.defaultName); return ct; } else if (typeof file == 'string') { renderImg(ct, file); } else { ct.attr('id', file.id); var title = file.title || file.name; if (file.ext) { title = title.substring(0, title.length - file.ext.length - 1); } setText(ct, title); } img_uploaded_num++; if (uploadItem && options.multi && img_uploaded_num >= options.maxPhoto) { uploadItem.hide(); } return ct; } function setText(item, title, desc) { return CallSetText(item, title, desc); // var h6 = item.find('h6'); // if (!h6.length) { // h6 = $('
').appendTo(item); // } // h6.text(title); } function setValues(item, values) { if(!values.path){ var source = values, src, img; if (typeof options.size != 'undefined') { src = SOSO.getImageUrl(source, options.size); } else { if(source.type == '云端'){ src = source.url; }else{ src = 'http://'+ window.location.host +'/'+ source.url; } // src = source.origin + source.path; } if(typeof values.desc == 'undefined'){ img = item.find('img').attr('src', src); if(source.type == '云端'){//若为上传,本应请求cp/upload 的接口,此处从在线图中上传时则没有path值,暂时先用资源处的地址代替 CallSetValues(item, {name: source.name || source.filename, path: source.url}, options); }else{ CallSetValues(item, {name: source.name || source.filename, path: 'http://'+ window.location.host +'/'+ source.url}, options); } } } //CallSetValues(item, {name: source.name || source.filename, path: source.path}, options); // CallSetValues(item, values, options); values = values || {}; if (options.editable) setText(item, values.title || values.name || '', values.desc || ''); values.update = 1; $.each(values, function () { var k = arguments[0], v = arguments[1], n = 'field' + k.substring(0, 1).toUpperCase() + k.substring(1), ipt, ipi; if (options[n]) { ipt = item.find("input[name='" + options[n] + "']"); if (!ipt.length) { ipt = $('').appendTo(item); } ipt.val(v); } /* 图片li列表,添加id */ // if(k =='id' && v){ // ipi = item.find("input[name='photos_desc[]']"); // if (!ipi.length) { // ipi = $('').appendTo(item); // } // ipi.val(v); // } }); item.data('soso.images', values); if (typeof options.setValues == 'function') { options.setValues(options, item, values); } } function getFields() { if ($.isArray(fields)) return fields; fields = []; $.each(options, function (k, v) { if (k.indexOf('field') == 0 && k.length > 5) { fields.push(k.substring(5).toLowerCase()); } }); return fields; } function getValue(item, fields) { if (fields) { if (!$.isArray(fields)) fields = [fields]; } else { fields = getFields(); } var values = {}; $.each(fields, function (v, k) { var n = 'field' + k.substring(0, 1).toUpperCase() + k.substring(1), ipt; if (options[n]) { ipt = item.find("input[name='" + options[n] + "']"); if (ipt.length) { values[k] = ipt.val(); } } }); return values; } function edit(item) { if (!item.hasClass(cls_uploaded)) return; if (options.editor) { options.editor.call(null, item, getValue(item), function (values) { setValues(item, values); }); return; } var form = $('
' + '' + '
' + '
' + '
' + '' + '
' + '
' + '
'), dialog = top.bootbox.dialog({ title: '图片属性', width: 560, draggable: true, message: form, buttons: { success: { label: "确定", className: "btn-success", callback: function () { var F = form.get(0), n = F.name.value.trim(); if (!n) return false; setValues(item, {name: n, desc: F.desc.value.trim()});// 设置页面显示 } }, cancel: {label: "取消", className: "btn-default"} } }); form.find('input').val(item.find('h6').text()); if (options.enabledesc !== false) { form.find('textarea').val(getValue(item, 'desc').desc || ''); } else { form.find('textarea').parent().parent().hide(); } } function del(item) { if (uploader) {//uploader.getFiles() != '' var i = 0, fileList = uploader.getFiles(), fileLen = fileList.length, fileId = item["0"].id; for (; i < fileLen; i++) { if (fileList[i].id == fileId) { uploaded = $.grep(uploaded, function (value) { return value != removeItem; }); uploader.removeFile(fileId); uploader.getFiles().splice(i, 1); } } } if (options.deletable !== false) { if (item.hasClass(cls_success) && $.isFunction(options.onBeforeDelete) && options.onBeforeDelete.call(null, item, function () { doDel(item); }) !== true) { return; } doDel(item); } if (options.delete) { options.delete.call(null, item); } } function doDel(item) { if (!options.multi) { item.removeClass(cls_uploaded).removeClass(cls_success).find('.vc-img-img').remove(); item.find('>input').remove(); renderBtns(item);//删除后重新渲染 } else { updateDelIds(item); img_uploaded_num--; uploadItem.show(); item.remove(); } if ($.isFunction(options.onDelete)) { options.onDelete.call(null, item); } } function updateDelIds(item) { var id = options['fieldId'], ids = options['deleteids']; if (id && ids) { if (!deleteIdsInput) { deleteIdsInput = element.find("input[name='" + ids + "']"); if (!deleteIdsInput.length) { deleteIdsInput = $('').appendTo(element); } } ids = deleteIdsInput.val(); id = item.find("input[name='" + id + "']").val(); ids = ids ? ids + ',' + id : id; deleteIdsInput.val(ids); } } function move(item, direction) { var cls = '.' + cls_item; if ('left' == direction) { item.after(item.prev(cls)); } else if ('right' == direction) { item.insertAfter(item.next(cls)); } } function server(item) { if (_server) return; _server = true; SOSO.Dialog.image({ singleSelect: !options.multi, max: options.maxPhoto, clasification: options.clasification, callback: function (rs) { if (options.multi && $.isArray(rs)) { $.each(rs, function () { // if(this.type == '云端'){ // setValues(renderItem(this.url, item), this); // }else{ // setValues(renderItem('http://'+window.location.host + '/' + this.url, item), this); // } setValues(renderItem(this.url, item), this); }); } else { btns.hide(); renderImg(item, SOSO.getImageUrl(rs, false)); setValues(item, rs); } return true; } }); _server = false; } function uploadSuccess(file, rs) {//从服务器成功拿回数据 CallUploadSuccess(file, rs, options); // var item = element.find('#' + file.id); // if (1 != rs.state) { // 不为1 则为上传错误 // if (rs != '') { // $('

上传错误

').appendTo(item.find('.vc-img-img')); // return; // } else { // return; // } // } // item.addClass(cls_success); // var source = rs.content, src, img; // if (typeof options.size != 'undefined') { // src = SOSO.getImageUrl(source, options.size); // } else { // src = source.origin + source.path; // } // img = item.find('img').attr('src', src); // setValues(item, {name: source.name || source.filename, path: source.path, id: source.id}); // if (options.uploadSuccess) {//此处去保存数组图片 // options.uploadSuccess.call(item.get(0), file, source); // } // element.find('#' + file.id).find('.vc-img-loading').remove(); } function renderUploader(item, btn) {// uploader = WebUploader.create({//设置上传参数 // 选完文件后,是否自动上传。 auto: true, // swf文件路径 swf: WU_SWF, // 文件接收服务端。 server: options.uploadAction, duplicate: true,//是否允许重复上传 // 选择文件的按钮。可选。 pick: { id: btn, multiple: options.multi }, formData: { brand: options.clasification ? options.clasification.brand : null, series: options.clasification ? options.clasification.series : null }, compress: false, // 只允许选择图片文件。 accept: { title: 'Images', extensions: 'gif,jpg,jpeg,bmp,png', mimeTypes: 'image/gif,image/jpg,image/jpeg,image/png,image/bmp' } }); if (btn.hasClass('btn-fixed-height')) { btn.find('.webuploader-pick').css('line-height', btn.height() + 'px'); } // 当有文件加入队列的时候 uploader.on('fileQueued', function (file) { // console.log('文件加入') // console.log('WU_SWF',WU_SWF) var img; if (options.multi) { if (img_uploaded_num >= options.maxPhoto) { alert('图片不能超过' + options.maxPhoto + '张'); return; } img = renderImg(renderItem(file, item), file); if (img_uploaded_num >= options.maxPhoto) { item.hide(); } } else { btns.hide(); item.attr('id', file.id); img = renderImg(item, file); } // 创建缩略图 this.makeThumb(file, function (error, src) { if (error) { img.replaceWith('

显示图片错误

'); return; } $('').prependTo(img.parent()); }, options.thumb_width, options.thumb_height); }); uploader.on('uploadProgress', function (file, percentage) { var item = element.find('#' + file.id), el = item.find('.vc-img-loading'); // 避免重复创建 if (!el.length) { el = $('

').appendTo(item.find('.vc-img-img')); } el.find('p').text('上传中'); }); // 文件上传失败,显示上传出错。 uploader.on('uploadError', function (file) { if (uploaded[fn] == '') { var fn = file.source.source.filename; var item = $('#' + file.id), el = item.find('.vc-img-error'); if (!el.length) { el = $('

').appendTo(item.find('.vc-img-img')); } el.find('p').text('上传失败'); } }); // 文件上传成功 uploader.on('uploadSuccess', function (file, rs) { // console.log('触发uploadSuccess,文件上传成功'); if (rs) uploadSuccess(file, rs); }); // 完成上传完了,成功或者失败,先删除加载进度条。(成功或失败之后才触发) uploader.on('uploadComplete', function (file) { // console.log('触发uploadComplete,完成上传完了,成功或者失败'); element.find('#' + file.id).find('.vc-img-loading').remove(); }); uploader.on('error', function (type, file) { console.log(type) if (type == 'F_DUPLICATE') { toast('图片 "' + file.name + '" 已经上传过,请勿重复上传'); } }); return false; } }; })(jQuery, window, document); function ImageButtonInit(btn, options, force) { //生成顶部删除按钮上传 var btn = $(btn), options = options || btn.data('options'); try { if (typeof options == 'string') options = $.parseJSON("{" + options + "}"); } catch (e) { console.log("解析JSON出错(img-upload):" + options); return; } options = options || {}; if (!force && options && options.render === false) return; var emptyCls = 'img-wrap-empty', closest; closest = options.closest ? btn.parent().closest(options.closest) : null; if (closest && closest.length) { options.el = closest.find(options.target), options.ipt = closest.find(options.input); } else { options.el = $(options.target), options.ipt = $(options.input); } options.src = options.src || options.ipt.val(); options.callback = function (rs, file, uploader) { options.ipt.val(rs.path); options.el.removeClass(emptyCls); }; ImageUploader(btn, options); if (options.el.length) { $('').appendTo(options.el).on('click', function () { options.ipt.val(''); options.el.find('img').remove(); options.el.addClass(emptyCls); }); var cls = 'img-wrap-hover'; options.el.hover(function () { if (options.el.find('img').length) options.el.addClass(cls) }, function () { options.el.removeClass(cls) }); if (!options.el.find('img').length) options.el.addClass(emptyCls) } } function ImageUploader(el, options) {//调用上传方法 var opt = $.extend({}, $.fn.imageGroup.defaults, options) options = options || {}; var img_uploaded_num = 100, error = '图片上传失败'; function setSrc(img, src) { if (!src) return; if (!img) img = $(); if (img.is('img')) { img.attr('src', src); } else { var _img = img.find('img'); if (_img.length > 0) { _img.eq(0).attr('src', src); } else { img.prepend(''); // console.log(img.html()) } } } if (options.src && options.el) { setSrc(options.el, SOSO.getPathImage(options.src)); } // console.log(UPLOAD_IMG); var uploader = WebUploader.create({ auto: true, swf: WU_SWF, server: options.uploadAction || UPLOAD_IMG, duplicate: true, pick: { id: el, multiple: opt.multi }, thumb: { width: 200, height: 200, quality: 100, allowMagnify: false, crop: false }, accept: { title: 'Images', extensions: 'gif,jpg,jpeg,bmp,png', mimeTypes: 'image/gif,image/jpg,image/jpeg,image/png,image/bmp' } }).on('fileQueued', function (file) {//push file // console.log('isMultiple',options); if (options.multi && img_uploaded_num >= options.max) { toast('图片不能超过' + options.max + '张'); return; } if (options.el) { this.makeThumb(file, function (error, src) { if (error) return toast('读取图片失败'); setSrc(options.el, src); }); } }).on('uploadError', function (file) { uploader.reset(); toast(error); }).on('uploadSuccess', function (file, rs) { if(rs){ if (1 != rs.state) { toast(error); return; } setSrc(options.el, rs.content.origin + rs.content.path); if (options.callback) { options.callback.call(null, rs.content, file); } } }); } function ImageSelector(options) { options = options || {}; SOSO.Dialog.image({ singleSelect: !options.multi, max: options.max, callback: function (rs) { if ($.isFunction(options.callback)) { return options.callback(rs); } return true; } }); }