require-upload.js 12 KB

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