define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined, Plupload, Template) {
var Upload = {
list: {},
config: {
container: document.body,
classname: '.plupload:not([initialized])',
previewtpl: '
',
},
events: {
//上传成功的回调
onUploadSuccess: function (ret, onUploadSuccess, button) {
var data = typeof ret.data !== 'undefined' ? ret.data : null;
//上传成功后回调
if (button) {
//如果有文本框则填充
var input_id = $(button).data("input-id") ? $(button).data("input-id") : "";
if (input_id) {
var urlArr = [];
var inputObj = $("#" + input_id);
if ($(button).data("multiple") && inputObj.val() !== "") {
urlArr.push(inputObj.val());
}
urlArr.push(data.url);
inputObj.val(urlArr.join(",")).trigger("change");
}
//如果有回调函数
var onDomUploadSuccess = $(button).data("upload-success");
if (onDomUploadSuccess) {
if (typeof onDomUploadSuccess !== 'function' && typeof Upload.api.custom[onDomUploadSuccess] === 'function') {
onDomUploadSuccess = Upload.api.custom[onDomUploadSuccess];
}
if (typeof onDomUploadSuccess === 'function') {
var result = onDomUploadSuccess.call(button, data, ret);
if (result === false)
return;
}
}
}
if (typeof onUploadSuccess === 'function') {
var result = onUploadSuccess.call(button, data, ret);
if (result === false)
return;
}
},
//上传错误的回调
onUploadError: function (ret, onUploadError, button) {
var data = typeof ret.data !== 'undefined' ? ret.data : null;
if (button) {
var onDomUploadError = $(button).data("upload-error");
if (onDomUploadError) {
if (typeof onDomUploadError !== 'function' && typeof Upload.api.custom[onDomUploadError] === 'function') {
onDomUploadError = Upload.api.custom[onDomUploadError];
}
if (typeof onDomUploadError === 'function') {
var result = onDomUploadError.call(button, data, ret);
if (result === false)
return;
}
}
}
if (typeof onUploadError === 'function') {
var result = onUploadError.call(button, data, ret);
if (result === false) {
return;
}
}
Toastr.error(ret.msg + "(code:" + ret.code + ")");
},
//服务器响应数据后
onUploadResponse: function (response) {
try {
var ret = typeof response === 'object' ? response : JSON.parse(response);
if (!ret.hasOwnProperty('code')) {
$.extend(ret, {code: -2, msg: response, data: null});
}
} catch (e) {
var ret = {code: -1, msg: e.message, data: null};
}
return ret;
}
},
api: {
//Plupload上传
plupload: function (element, onUploadSuccess, onUploadError) {
element = typeof element === 'undefined' ? Upload.config.classname : element;
$(element, Upload.config.container).each(function () {
$(this).attr("initialized", true);
var that = this;
var id = $(this).prop("id");
var url = $(this).data("url");
var maxsize = $(this).data("maxsize");
var mimetype = $(this).data("mimetype");
var multipart = $(this).data("multipart");
var multiple = $(this).data("multiple");
//填充ID
var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
//预览ID
var preview_id = $(that).data("preview-id") ? $(that).data("preview-id") : "";
//上传URL
url = url ? url : Config.upload.uploadurl;
url = Fast.api.fixurl(url);
//最大可上传
maxsize = typeof maxsize !== "undefined" ? maxsize : Config.upload.maxsize;
//文件类型
mimetype = typeof mimetype !== "undefined" ? mimetype : Config.upload.mimetype;
//请求的表单参数
multipart = typeof multipart !== "undefined" ? multipart : Config.upload.multipart;
//是否支持批量上传
multiple = typeof multiple !== "undefined" ? multiple : Config.upload.multiple;
//生成Plupload实例
Upload.list[id] = new Plupload.Uploader({
runtimes: 'html5,flash,silverlight,html4',
multi_selection: multiple, //是否允许多选批量上传
browse_button: id, // 浏览按钮的ID
container: $(this).parent().get(0), //取按钮的上级元素
flash_swf_url: '/assets/libs/plupload/js/Moxie.swf',
silverlight_xap_url: '/assets/libs/plupload/js/Moxie.xap',
filters: {
max_file_size: maxsize,
mime_types: mimetype
},
url: url,
multipart_params: multipart,
init: {
PostInit: function () {
},
FilesAdded: function (up, files) {
var button = up.settings.button;
$(button).data("bakup-html", $(button).html());
//添加后立即上传
setTimeout(function () {
up.start();
}, 1);
},
UploadProgress: function (up, file) {
var button = up.settings.button;
//这里可以改成其它的表现形式
//document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '' + file.percent + "%";
$(button).prop("disabled", true).html(" " + __('Upload') + file.percent + "%");
},
FileUploaded: function (up, file, info) {
var button = up.settings.button;
//还原按钮文字及状态
$(button).prop("disabled", false).html($(button).data("bakup-html"));
var ret = Upload.events.onUploadResponse(info.response);
if (ret.code === 1) {
Upload.events.onUploadSuccess(ret, onUploadSuccess, button);
} else {
Upload.events.onUploadError(ret, onUploadError, button);
}
},
Error: function (up, err) {
var button = up.settings.button;
$(button).prop("disabled", false).html($(button).data("bakup-html"));
var ret = {code: err.code, msg: err.message, data: null};
Upload.events.onUploadError(ret, onUploadError, button);
}
},
onUploadSuccess: onUploadSuccess,
onUploadError: onUploadError,
button: that
});
//拖动排序
if (preview_id && multiple) {
require(['dragsort'], function () {
$("#" + preview_id).dragsort({
dragSelector: "li",
dragEnd: function () {
$("#" + preview_id).trigger("fa.preview.change");
},
placeHolderTemplate: ''
});
});
}
if (preview_id && input_id) {
$(document.body).on("keyup change", "#" + input_id, function () {
var inputStr = $("#" + input_id).val();
var inputArr = inputStr.split(/\,/);
$("#" + preview_id).empty();
var tpl = $("#" + preview_id).data("template") ? $("#" + preview_id).data("template") : "";
$.each(inputArr, function (i, j) {
if (!j) {
return true;
}
var data = {url: j, fullurl: Fast.api.cdnurl(j), data: $(that).data()};
var html = tpl ? Template(tpl, data) : Template.render(Upload.config.previewtpl, data);
$("#" + preview_id).append(html);
});
});
$("#" + input_id).trigger("keyup");
}
if (preview_id) {
// 监听事件
$(document.body).on("fa.preview.change", "#" + preview_id, function () {
var urlArr = new Array();
$("#" + preview_id + " [data-url]").each(function (i, j) {
urlArr.push($(this).data("url"));
});
if (input_id) {
$("#" + input_id).val(urlArr.join(","));
}
});
// 移除按钮事件
$(document.body).on("click", "#" + preview_id + " .btn-trash", function () {
$(this).closest("li").remove();
$("#" + preview_id).trigger("fa.preview.change");
});
}
Upload.list[id].init();
});
},
// AJAX异步上传
send: function (file, onUploadSuccess, onUploadError) {
var data = new FormData();
data.append("file", file);
$.each(Config.upload.multipart, function (k, v) {
data.append(k, v);
});
$.ajax({
url: Config.upload.uploadurl,
data: data,
cache: false,
contentType: false,
processData: false,
type: 'POST',
success: function (ret) {
ret = Upload.events.onUploadResponse(ret);
if (ret.code === 1) {
Upload.events.onUploadSuccess(ret, onUploadSuccess);
} else {
Upload.events.onUploadError(ret, onUploadError);
}
}, error: function (e) {
var ret = {code: 500, msg: e.message, data: null};
Upload.events.onUploadError(ret, onUploadError);
}
});
},
custom: {
//自定义上传完成回调
afteruploadcallback: function (response) {
console.log(this, response);
alert("Custom Callback,Response URL:" + response.url);
},
},
}
};
return Upload;
});