simpleupload.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /**
  2. * @description
  3. * 简单上传:点击按钮,直接选择文件上传
  4. * @author Jinqn
  5. * @date 2014-03-31
  6. */
  7. UE.plugin.register("simpleupload", function() {
  8. var me = this,
  9. isLoaded = false,
  10. containerBtn;
  11. function initUploadBtn() {
  12. var w = containerBtn.offsetWidth || 20,
  13. h = containerBtn.offsetHeight || 20,
  14. btnIframe = document.createElement("iframe"),
  15. btnStyle =
  16. "display:block;width:" +
  17. w +
  18. "px;height:" +
  19. h +
  20. "px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;";
  21. domUtils.on(btnIframe, "load", function() {
  22. var timestrap = (+new Date()).toString(36),
  23. wrapper,
  24. btnIframeDoc,
  25. btnIframeBody;
  26. btnIframeDoc =
  27. btnIframe.contentDocument || btnIframe.contentWindow.document;
  28. btnIframeBody = btnIframeDoc.body;
  29. wrapper = btnIframeDoc.createElement("div");
  30. wrapper.innerHTML =
  31. '<form id="edui_form_' +
  32. timestrap +
  33. '" target="edui_iframe_' +
  34. timestrap +
  35. '" method="POST" enctype="multipart/form-data" action="' +
  36. me.getOpt("serverUrl") +
  37. '" ' +
  38. 'style="' +
  39. btnStyle +
  40. '">' +
  41. '<input id="edui_input_' +
  42. timestrap +
  43. '" type="file" accept="image/*" name="' +
  44. me.options.imageFieldName +
  45. '" ' +
  46. 'style="' +
  47. btnStyle +
  48. '">' +
  49. "</form>" +
  50. '<iframe id="edui_iframe_' +
  51. timestrap +
  52. '" name="edui_iframe_' +
  53. timestrap +
  54. '" style="display:none;width:0;height:0;border:0;margin:0;padding:0;position:absolute;"></iframe>';
  55. wrapper.className = "edui-" + me.options.theme;
  56. wrapper.id = me.ui.id + "_iframeupload";
  57. btnIframeBody.style.cssText = btnStyle;
  58. btnIframeBody.style.width = w + "px";
  59. btnIframeBody.style.height = h + "px";
  60. btnIframeBody.appendChild(wrapper);
  61. if (btnIframeBody.parentNode) {
  62. btnIframeBody.parentNode.style.width = w + "px";
  63. btnIframeBody.parentNode.style.height = w + "px";
  64. }
  65. var form = btnIframeDoc.getElementById("edui_form_" + timestrap);
  66. var input = btnIframeDoc.getElementById("edui_input_" + timestrap);
  67. var iframe = btnIframeDoc.getElementById("edui_iframe_" + timestrap);
  68. domUtils.on(input, "change", function() {
  69. if (!input.value) return;
  70. var loadingId = "loading_" + (+new Date()).toString(36);
  71. var params =
  72. utils.serializeParam(me.queryCommandValue("serverparam")) || "";
  73. var imageActionUrl = me.getActionUrl(me.getOpt("imageActionName"));
  74. var allowFiles = me.getOpt("imageAllowFiles");
  75. me.focus();
  76. me.execCommand(
  77. "inserthtml",
  78. '<img class="loadingclass" id="' +
  79. loadingId +
  80. '" src="' +
  81. me.options.themePath +
  82. me.options.theme +
  83. '/images/spacer.gif">'
  84. );
  85. function callback() {
  86. try {
  87. var link,
  88. json,
  89. loader,
  90. body = (iframe.contentDocument || iframe.contentWindow.document)
  91. .body,
  92. result = body.innerText || body.textContent || "";
  93. json = new Function("return " + result)();
  94. link = me.options.imageUrlPrefix + json.url;
  95. if (json.state == "SUCCESS" && json.url) {
  96. loader = me.document.getElementById(loadingId);
  97. domUtils.removeClasses(loader, "loadingclass");
  98. loader.setAttribute("src", link);
  99. loader.setAttribute("_src", link);
  100. loader.setAttribute("alt", json.original || "");
  101. loader.removeAttribute("id");
  102. me.fireEvent("contentchange");
  103. } else {
  104. showErrorLoader && showErrorLoader(json.state);
  105. }
  106. } catch (er) {
  107. showErrorLoader &&
  108. showErrorLoader(me.getLang("simpleupload.loadError"));
  109. }
  110. form.reset();
  111. domUtils.un(iframe, "load", callback);
  112. }
  113. function showErrorLoader(title) {
  114. if (loadingId) {
  115. var loader = me.document.getElementById(loadingId);
  116. loader && domUtils.remove(loader);
  117. me.fireEvent("showmessage", {
  118. id: loadingId,
  119. content: title,
  120. type: "error",
  121. timeout: 4000
  122. });
  123. }
  124. }
  125. /* 判断后端配置是否没有加载成功 */
  126. if (!me.getOpt("imageActionName")) {
  127. errorHandler(me.getLang("autoupload.errorLoadConfig"));
  128. return;
  129. }
  130. // 判断文件格式是否错误
  131. var filename = input.value,
  132. fileext = filename ? filename.substr(filename.lastIndexOf(".")) : "";
  133. if (
  134. !fileext ||
  135. (allowFiles &&
  136. (allowFiles.join("") + ".").indexOf(fileext.toLowerCase() + ".") ==
  137. -1)
  138. ) {
  139. showErrorLoader(me.getLang("simpleupload.exceedTypeError"));
  140. return;
  141. }
  142. domUtils.on(iframe, "load", callback);
  143. form.action = utils.formatUrl(
  144. imageActionUrl +
  145. (imageActionUrl.indexOf("?") == -1 ? "?" : "&") +
  146. params
  147. );
  148. form.submit();
  149. });
  150. var stateTimer;
  151. me.addListener("selectionchange", function() {
  152. clearTimeout(stateTimer);
  153. stateTimer = setTimeout(function() {
  154. var state = me.queryCommandState("simpleupload");
  155. if (state == -1) {
  156. input.disabled = "disabled";
  157. } else {
  158. input.disabled = false;
  159. }
  160. }, 400);
  161. });
  162. isLoaded = true;
  163. });
  164. btnIframe.style.cssText = btnStyle;
  165. containerBtn.appendChild(btnIframe);
  166. }
  167. return {
  168. bindEvents: {
  169. ready: function() {
  170. //设置loading的样式
  171. utils.cssRule(
  172. "loading",
  173. ".loadingclass{display:inline-block;cursor:default;background: url('" +
  174. this.options.themePath +
  175. this.options.theme +
  176. "/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n" +
  177. ".loaderrorclass{display:inline-block;cursor:default;background: url('" +
  178. this.options.themePath +
  179. this.options.theme +
  180. "/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;" +
  181. "}",
  182. this.document
  183. );
  184. },
  185. /* 初始化简单上传按钮 */
  186. simpleuploadbtnready: function(type, container) {
  187. containerBtn = container;
  188. me.afterConfigReady(initUploadBtn);
  189. }
  190. },
  191. outputRule: function(root) {
  192. utils.each(root.getNodesByTagName("img"), function(n) {
  193. if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr("class"))) {
  194. n.parentNode.removeChild(n);
  195. }
  196. });
  197. },
  198. commands: {
  199. simpleupload: {
  200. queryCommandState: function() {
  201. return isLoaded ? 0 : -1;
  202. }
  203. }
  204. }
  205. };
  206. });