require-upload.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined, Plupload, Template) {
  2. var Upload = {
  3. list: {},
  4. config: {
  5. container: document.body,
  6. classname: '.plupload:not([initialized])',
  7. previewtpl: '<li class="col-xs-3"><a href="<%=fullurl%>" data-url="<%=url%>" target="_blank" class="thumbnail"><img src="<%=fullurl%>" class="img-responsive"></a><a href="javascript:;" class="btn btn-danger btn-xs btn-trash"><i class="fa fa-trash"></i></a></li>',
  8. },
  9. events: {
  10. //初始化完成
  11. onPostInit: function (up) {
  12. },
  13. //文件添加成功后
  14. onFileAdded: function (up, files) {
  15. var button = up.settings.button;
  16. $(button).data("bakup-html", $(button).html());
  17. var maxcount = $(button).data("maxcount");
  18. var input_id = $(button).data("input-id") ? $(button).data("input-id") : "";
  19. maxcount = typeof maxcount !== "undefined" ? maxcount : 0;
  20. if (maxcount > 0 && input_id) {
  21. var inputObj = $("#" + input_id);
  22. if (inputObj.size() > 0) {
  23. var value = $.trim(inputObj.val());
  24. var nums = value === '' ? 0 : value.split(/\,/).length;
  25. var remains = maxcount - nums;
  26. if (files.length > remains) {
  27. for (var i = 0; i < files.length; i++) {
  28. up.removeFile(files[i]);
  29. }
  30. Toastr.error(__('You can upload up to %d file%s', remains));
  31. return false;
  32. }
  33. }
  34. }
  35. //添加后立即上传
  36. setTimeout(function () {
  37. up.start();
  38. }, 1);
  39. },
  40. //上传进行中的回调
  41. onUploadProgress: function (up, file) {
  42. },
  43. //上传之前的回调
  44. onBeforeUpload: function (up, file) {
  45. },
  46. //上传成功的回调
  47. onUploadSuccess: function (up, ret) {
  48. var button = up.settings.button;
  49. var onUploadSuccess = up.settings.onUploadSuccess;
  50. var data = typeof ret.data !== 'undefined' ? ret.data : null;
  51. //上传成功后回调
  52. if (button) {
  53. //如果有文本框则填充
  54. var input_id = $(button).data("input-id") ? $(button).data("input-id") : "";
  55. if (input_id) {
  56. var urlArr = [];
  57. var inputObj = $("#" + input_id);
  58. if ($(button).data("multiple") && inputObj.val() !== "") {
  59. urlArr.push(inputObj.val());
  60. }
  61. urlArr.push(data.url);
  62. inputObj.val(urlArr.join(",")).trigger("change");
  63. }
  64. //如果有回调函数
  65. var onDomUploadSuccess = $(button).data("upload-success");
  66. if (onDomUploadSuccess) {
  67. if (typeof onDomUploadSuccess !== 'function' && typeof Upload.api.custom[onDomUploadSuccess] === 'function') {
  68. onDomUploadSuccess = Upload.api.custom[onDomUploadSuccess];
  69. }
  70. if (typeof onDomUploadSuccess === 'function') {
  71. var result = onDomUploadSuccess.call(button, data, ret);
  72. if (result === false)
  73. return;
  74. }
  75. }
  76. }
  77. if (typeof onUploadSuccess === 'function') {
  78. var result = onUploadSuccess.call(button, data, ret);
  79. if (result === false)
  80. return;
  81. }
  82. },
  83. //上传错误的回调
  84. onUploadError: function (up, ret) {
  85. var button = up.settings.button;
  86. var onUploadError = up.settings.onUploadError;
  87. var data = typeof ret.data !== 'undefined' ? ret.data : null;
  88. if (button) {
  89. var onDomUploadError = $(button).data("upload-error");
  90. if (onDomUploadError) {
  91. if (typeof onDomUploadError !== 'function' && typeof Upload.api.custom[onDomUploadError] === 'function') {
  92. onDomUploadError = Upload.api.custom[onDomUploadError];
  93. }
  94. if (typeof onDomUploadError === 'function') {
  95. var result = onDomUploadError.call(button, data, ret);
  96. if (result === false)
  97. return;
  98. }
  99. }
  100. }
  101. if (typeof onUploadError === 'function') {
  102. var result = onUploadError.call(button, data, ret);
  103. if (result === false) {
  104. return;
  105. }
  106. }
  107. Toastr.error(ret.msg + "(code:" + ret.code + ")");
  108. },
  109. //服务器响应数据后
  110. onUploadResponse: function (response) {
  111. try {
  112. var ret = typeof response === 'object' ? response : JSON.parse(response);
  113. if (!ret.hasOwnProperty('code')) {
  114. $.extend(ret, {code: -2, msg: response, data: null});
  115. }
  116. } catch (e) {
  117. var ret = {code: -1, msg: e.message, data: null};
  118. }
  119. return ret;
  120. },
  121. //上传全部结束后
  122. onUploadComplete: function (up, files) {
  123. var button = up.settings.button;
  124. var onUploadComplete = up.settings.onUploadComplete;
  125. if (button) {
  126. var onDomUploadComplete = $(button).data("upload-complete");
  127. if (onDomUploadComplete) {
  128. if (typeof onDomUploadComplete !== 'function' && typeof Upload.api.custom[onDomUploadComplete] === 'function') {
  129. onDomUploadComplete = Upload.api.custom[onDomUploadComplete];
  130. }
  131. if (typeof onDomUploadComplete === 'function') {
  132. var result = onDomUploadComplete.call(button, files);
  133. if (result === false)
  134. return;
  135. }
  136. }
  137. }
  138. if (typeof onUploadComplete === 'function') {
  139. var result = onUploadComplete.call(button, files);
  140. if (result === false) {
  141. return;
  142. }
  143. }
  144. }
  145. },
  146. api: {
  147. //Plupload上传
  148. plupload: function (element, onUploadSuccess, onUploadError, onUploadComplete) {
  149. element = typeof element === 'undefined' ? Upload.config.classname : element;
  150. $(element, Upload.config.container).each(function () {
  151. if ($(this).attr("initialized")) {
  152. return true;
  153. }
  154. $(this).attr("initialized", true);
  155. var that = this;
  156. var id = $(this).prop("id");
  157. var url = $(this).data("url");
  158. var maxsize = $(this).data("maxsize");
  159. var mimetype = $(this).data("mimetype");
  160. var multipart = $(this).data("multipart");
  161. var multiple = $(this).data("multiple");
  162. //填充ID
  163. var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
  164. //预览ID
  165. var preview_id = $(that).data("preview-id") ? $(that).data("preview-id") : "";
  166. //上传URL
  167. url = url ? url : Config.upload.uploadurl;
  168. url = Fast.api.fixurl(url);
  169. //最大可上传文件大小
  170. maxsize = typeof maxsize !== "undefined" ? maxsize : Config.upload.maxsize;
  171. //文件类型
  172. mimetype = typeof mimetype !== "undefined" ? mimetype : Config.upload.mimetype;
  173. //请求的表单参数
  174. multipart = typeof multipart !== "undefined" ? multipart : Config.upload.multipart;
  175. //是否支持批量上传
  176. multiple = typeof multiple !== "undefined" ? multiple : Config.upload.multiple;
  177. var mimetypeArr = new Array();
  178. //支持后缀和Mimetype格式,以,分隔
  179. if (mimetype && mimetype !== "*" && mimetype.indexOf("/") === -1)
  180. {
  181. var tempArr = mimetype.split(',');
  182. for (var i = 0; i < tempArr.length; i++)
  183. {
  184. mimetypeArr.push({title: __('Files'), extensions: tempArr[i]});
  185. }
  186. mimetype = mimetypeArr;
  187. }
  188. //生成Plupload实例
  189. Upload.list[id] = new Plupload.Uploader({
  190. runtimes: 'html5,flash,silverlight,html4',
  191. multi_selection: multiple, //是否允许多选批量上传
  192. browse_button: id, // 浏览按钮的ID
  193. container: $(this).parent().get(0), //取按钮的上级元素
  194. flash_swf_url: '/assets/libs/plupload/js/Moxie.swf',
  195. silverlight_xap_url: '/assets/libs/plupload/js/Moxie.xap',
  196. filters: {
  197. max_file_size: maxsize,
  198. mime_types: mimetype,
  199. },
  200. url: url,
  201. multipart_params: $.isArray(multipart) ? {} : multipart,
  202. init: {
  203. PostInit: Upload.events.onPostInit,
  204. FilesAdded: Upload.events.onFileAdded,
  205. BeforeUpload: Upload.events.onBeforeUpload,
  206. UploadProgress: function (up, file) {
  207. var button = up.settings.button;
  208. $(button).prop("disabled", true).html("<i class='fa fa-upload'></i> " + __('Upload') + file.percent + "%");
  209. Upload.events.onUploadProgress(up, file);
  210. },
  211. FileUploaded: function (up, file, info) {
  212. var button = up.settings.button;
  213. //还原按钮文字及状态
  214. $(button).prop("disabled", false).html($(button).data("bakup-html"));
  215. var ret = Upload.events.onUploadResponse(info.response, info, up, file);
  216. file.ret = ret;
  217. if (ret.code === 1) {
  218. Upload.events.onUploadSuccess(up, ret, file);
  219. } else {
  220. Upload.events.onUploadError(up, ret, file);
  221. }
  222. },
  223. UploadComplete: Upload.events.onUploadComplete,
  224. Error: function (up, err) {
  225. var button = up.settings.button;
  226. $(button).prop("disabled", false).html($(button).data("bakup-html"));
  227. var ret = {code: err.code, msg: err.message, data: null};
  228. Upload.events.onUploadError(up, ret);
  229. }
  230. },
  231. onUploadSuccess: onUploadSuccess,
  232. onUploadError: onUploadError,
  233. onUploadComplete: onUploadComplete,
  234. button: that
  235. });
  236. //拖动排序
  237. if (preview_id && multiple) {
  238. require(['dragsort'], function () {
  239. $("#" + preview_id).dragsort({
  240. dragSelector: "li",
  241. dragEnd: function () {
  242. $("#" + preview_id).trigger("fa.preview.change");
  243. },
  244. placeHolderTemplate: '<li class="col-xs-3"></li>'
  245. });
  246. });
  247. }
  248. if (preview_id && input_id) {
  249. $(document.body).on("keyup change", "#" + input_id, function () {
  250. var inputStr = $("#" + input_id).val();
  251. var inputArr = inputStr.split(/\,/);
  252. $("#" + preview_id).empty();
  253. var tpl = $("#" + preview_id).data("template") ? $("#" + preview_id).data("template") : "";
  254. $.each(inputArr, function (i, j) {
  255. if (!j) {
  256. return true;
  257. }
  258. var data = {url: j, fullurl: Fast.api.cdnurl(j), data: $(that).data()};
  259. var html = tpl ? Template(tpl, data) : Template.render(Upload.config.previewtpl, data);
  260. $("#" + preview_id).append(html);
  261. });
  262. });
  263. $("#" + input_id).trigger("change");
  264. }
  265. if (preview_id) {
  266. // 监听事件
  267. $(document.body).on("fa.preview.change", "#" + preview_id, function () {
  268. var urlArr = new Array();
  269. $("#" + preview_id + " [data-url]").each(function (i, j) {
  270. urlArr.push($(this).data("url"));
  271. });
  272. if (input_id) {
  273. $("#" + input_id).val(urlArr.join(","));
  274. }
  275. });
  276. // 移除按钮事件
  277. $(document.body).on("click", "#" + preview_id + " .btn-trash", function () {
  278. $(this).closest("li").remove();
  279. $("#" + preview_id).trigger("fa.preview.change");
  280. });
  281. }
  282. Upload.list[id].init();
  283. });
  284. },
  285. // AJAX异步上传
  286. send: function (file, onUploadSuccess, onUploadError, onUploadComplete) {
  287. var index = Layer.msg(__('Uploading'), {offset: 't', time: 0});
  288. var id = Plupload.guid();
  289. var _onPostInit = Upload.events.onPostInit;
  290. Upload.events.onPostInit = function () {
  291. // 当加载完成后添加文件并上传
  292. Upload.list[id].addFile(file);
  293. //Upload.list[id].start();
  294. };
  295. $('<button type="button" id="' + id + '" class="btn btn-danger hidden plupload" />').appendTo("body");
  296. $("#" + id).data("upload-complete", function (files) {
  297. Upload.events.onPostInit = _onPostInit;
  298. Layer.close(index);
  299. });
  300. Upload.api.plupload("#" + id, onUploadSuccess, onUploadError, onUploadComplete);
  301. },
  302. custom: {
  303. //自定义上传完成回调
  304. afteruploadcallback: function (response) {
  305. console.log(this, response);
  306. alert("Custom Callback,Response URL:" + response.url);
  307. },
  308. },
  309. }
  310. };
  311. return Upload;
  312. });