require-upload.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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. onUploadSuccess: function (ret, onUploadSuccess, button) {
  12. var data = typeof ret.data !== 'undefined' ? ret.data : null;
  13. //上传成功后回调
  14. if (button) {
  15. //如果有文本框则填充
  16. var input_id = $(button).data("input-id") ? $(button).data("input-id") : "";
  17. if (input_id) {
  18. var urlArr = [];
  19. var inputObj = $("#" + input_id);
  20. if ($(button).data("multiple") && inputObj.val() !== "") {
  21. urlArr.push(inputObj.val());
  22. }
  23. urlArr.push(data.url);
  24. inputObj.val(urlArr.join(",")).trigger("change");
  25. }
  26. //如果有回调函数
  27. var onDomUploadSuccess = $(button).data("upload-success");
  28. if (onDomUploadSuccess) {
  29. if (typeof onDomUploadSuccess !== 'function' && typeof Upload.api.custom[onDomUploadSuccess] === 'function') {
  30. onDomUploadSuccess = Upload.api.custom[onDomUploadSuccess];
  31. }
  32. if (typeof onDomUploadSuccess === 'function') {
  33. var result = onDomUploadSuccess.call(button, data, ret);
  34. if (result === false)
  35. return;
  36. }
  37. }
  38. }
  39. if (typeof onUploadSuccess === 'function') {
  40. var result = onUploadSuccess.call(button, data, ret);
  41. if (result === false)
  42. return;
  43. }
  44. },
  45. //上传错误的回调
  46. onUploadError: function (ret, onUploadError, button) {
  47. var data = typeof ret.data !== 'undefined' ? ret.data : null;
  48. if (button) {
  49. var onDomUploadError = $(button).data("upload-error");
  50. if (onDomUploadError) {
  51. if (typeof onDomUploadError !== 'function' && typeof Upload.api.custom[onDomUploadError] === 'function') {
  52. onDomUploadError = Upload.api.custom[onDomUploadError];
  53. }
  54. if (typeof onDomUploadError === 'function') {
  55. var result = onDomUploadError.call(button, data, ret);
  56. if (result === false)
  57. return;
  58. }
  59. }
  60. }
  61. if (typeof onUploadError === 'function') {
  62. var result = onUploadError.call(button, data, ret);
  63. if (result === false) {
  64. return;
  65. }
  66. }
  67. Toastr.error(ret.msg + "(code:" + ret.code + ")");
  68. },
  69. //服务器响应数据后
  70. onUploadResponse: function (response) {
  71. try {
  72. var ret = typeof response === 'object' ? response : JSON.parse(response);
  73. if (!ret.hasOwnProperty('code')) {
  74. $.extend(ret, {code: -2, msg: response, data: null});
  75. }
  76. } catch (e) {
  77. var ret = {code: -1, msg: e.message, data: null};
  78. }
  79. return ret;
  80. }
  81. },
  82. api: {
  83. //Plupload上传
  84. plupload: function (element, onUploadSuccess, onUploadError) {
  85. element = typeof element === 'undefined' ? Upload.config.classname : element;
  86. $(element, Upload.config.container).each(function () {
  87. $(this).attr("initialized", true);
  88. var that = this;
  89. var id = $(this).prop("id");
  90. var url = $(this).data("url");
  91. var maxsize = $(this).data("maxsize");
  92. var mimetype = $(this).data("mimetype");
  93. var multipart = $(this).data("multipart");
  94. var multiple = $(this).data("multiple");
  95. //填充ID
  96. var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
  97. //预览ID
  98. var preview_id = $(that).data("preview-id") ? $(that).data("preview-id") : "";
  99. //上传URL
  100. url = url ? url : Config.upload.uploadurl;
  101. url = Fast.api.fixurl(url);
  102. //最大可上传
  103. maxsize = typeof maxsize !== "undefined" ? maxsize : Config.upload.maxsize;
  104. //文件类型
  105. mimetype = typeof mimetype !== "undefined" ? mimetype : Config.upload.mimetype;
  106. //请求的表单参数
  107. multipart = typeof multipart !== "undefined" ? multipart : Config.upload.multipart;
  108. //是否支持批量上传
  109. multiple = typeof multiple !== "undefined" ? multiple : Config.upload.multiple;
  110. //生成Plupload实例
  111. Upload.list[id] = new Plupload.Uploader({
  112. runtimes: 'html5,flash,silverlight,html4',
  113. multi_selection: multiple, //是否允许多选批量上传
  114. browse_button: id, // 浏览按钮的ID
  115. container: $(this).parent().get(0), //取按钮的上级元素
  116. flash_swf_url: '/assets/libs/plupload/js/Moxie.swf',
  117. silverlight_xap_url: '/assets/libs/plupload/js/Moxie.xap',
  118. filters: {
  119. max_file_size: maxsize,
  120. mime_types: mimetype
  121. },
  122. url: url,
  123. multipart_params: multipart,
  124. init: {
  125. PostInit: function () {
  126. },
  127. FilesAdded: function (up, files) {
  128. var button = up.settings.button;
  129. $(button).data("bakup-html", $(button).html());
  130. //添加后立即上传
  131. setTimeout(function () {
  132. up.start();
  133. }, 1);
  134. },
  135. UploadProgress: function (up, file) {
  136. var button = up.settings.button;
  137. //这里可以改成其它的表现形式
  138. //document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
  139. $(button).prop("disabled", true).html("<i class='fa fa-upload'></i> " + __('Upload') + file.percent + "%");
  140. },
  141. FileUploaded: function (up, file, info) {
  142. var button = up.settings.button;
  143. //还原按钮文字及状态
  144. $(button).prop("disabled", false).html($(button).data("bakup-html"));
  145. var ret = Upload.events.onUploadResponse(info.response);
  146. if (ret.code === 1) {
  147. Upload.events.onUploadSuccess(ret, onUploadSuccess, button);
  148. } else {
  149. Upload.events.onUploadError(ret, onUploadError, button);
  150. }
  151. },
  152. Error: function (up, err) {
  153. var button = up.settings.button;
  154. $(button).prop("disabled", false).html($(button).data("bakup-html"));
  155. var ret = {code: err.code, msg: err.message, data: null};
  156. Upload.events.onUploadError(ret, onUploadError, button);
  157. }
  158. },
  159. onUploadSuccess: onUploadSuccess,
  160. onUploadError: onUploadError,
  161. button: that
  162. });
  163. //拖动排序
  164. if (preview_id && multiple) {
  165. require(['dragsort'], function () {
  166. $("#" + preview_id).dragsort({
  167. dragSelector: "li",
  168. dragEnd: function () {
  169. $("#" + preview_id).trigger("fa.preview.change");
  170. },
  171. placeHolderTemplate: '<li class="col-xs-3"></li>'
  172. });
  173. });
  174. }
  175. if (preview_id && input_id) {
  176. $(document.body).on("keyup change", "#" + input_id, function () {
  177. var inputStr = $("#" + input_id).val();
  178. var inputArr = inputStr.split(/\,/);
  179. $("#" + preview_id).empty();
  180. var tpl = $("#" + preview_id).data("template") ? $("#" + preview_id).data("template") : "";
  181. $.each(inputArr, function (i, j) {
  182. if (!j) {
  183. return true;
  184. }
  185. var data = {url: j, fullurl: Fast.api.cdnurl(j), data: $(that).data()};
  186. var html = tpl ? Template(tpl, data) : Template.render(Upload.config.previewtpl, data);
  187. $("#" + preview_id).append(html);
  188. });
  189. });
  190. $("#" + input_id).trigger("keyup");
  191. }
  192. if (preview_id) {
  193. // 监听事件
  194. $(document.body).on("fa.preview.change", "#" + preview_id, function () {
  195. var urlArr = new Array();
  196. $("#" + preview_id + " [data-url]").each(function (i, j) {
  197. urlArr.push($(this).data("url"));
  198. });
  199. if (input_id) {
  200. $("#" + input_id).val(urlArr.join(","));
  201. }
  202. });
  203. // 移除按钮事件
  204. $(document.body).on("click", "#" + preview_id + " .btn-trash", function () {
  205. $(this).closest("li").remove();
  206. $("#" + preview_id).trigger("fa.preview.change");
  207. });
  208. }
  209. Upload.list[id].init();
  210. });
  211. },
  212. // AJAX异步上传
  213. send: function (file, onUploadSuccess, onUploadError) {
  214. var data = new FormData();
  215. data.append("file", file);
  216. $.each(Config.upload.multipart, function (k, v) {
  217. data.append(k, v);
  218. });
  219. $.ajax({
  220. url: Config.upload.uploadurl,
  221. data: data,
  222. cache: false,
  223. contentType: false,
  224. processData: false,
  225. type: 'POST',
  226. success: function (ret) {
  227. ret = Upload.events.onUploadResponse(ret);
  228. if (ret.code === 1) {
  229. Upload.events.onUploadSuccess(ret, onUploadSuccess);
  230. } else {
  231. Upload.events.onUploadError(ret, onUploadError);
  232. }
  233. }, error: function (e) {
  234. var ret = {code: 500, msg: e.message, data: null};
  235. Upload.events.onUploadError(ret, onUploadError);
  236. }
  237. });
  238. },
  239. custom: {
  240. //自定义上传完成回调
  241. afteruploadcallback: function (response) {
  242. console.log(this, response);
  243. alert("Custom Callback,Response URL:" + response.url);
  244. },
  245. },
  246. }
  247. };
  248. return Upload;
  249. });