simpleupload.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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 = 'display:block;width:' + w + 'px;height:' + h + '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;';
  16. domUtils.on(btnIframe, 'load', function(){
  17. var timestrap = (+new Date()).toString(36),
  18. wrapper,
  19. btnIframeDoc,
  20. btnIframeBody;
  21. btnIframeDoc = (btnIframe.contentDocument || btnIframe.contentWindow.document);
  22. btnIframeBody = btnIframeDoc.body;
  23. wrapper = btnIframeDoc.createElement('div');
  24. wrapper.innerHTML = '<form id="edui_form_' + timestrap + '" target="edui_iframe_' + timestrap + '" method="POST" enctype="multipart/form-data" action="' + me.getOpt('serverUrl') + '" ' +
  25. 'style="' + btnStyle + '">' +
  26. '<input id="edui_input_' + timestrap + '" type="file" accept="image/*" name="' + me.options.imageFieldName + '" ' +
  27. 'style="' + btnStyle + '">' +
  28. '</form>' +
  29. '<iframe id="edui_iframe_' + timestrap + '" name="edui_iframe_' + timestrap + '" style="display:none;width:0;height:0;border:0;margin:0;padding:0;position:absolute;"></iframe>';
  30. wrapper.className = 'edui-' + me.options.theme;
  31. wrapper.id = me.ui.id + '_iframeupload';
  32. btnIframeBody.style.cssText = btnStyle;
  33. btnIframeBody.style.width = w + 'px';
  34. btnIframeBody.style.height = h + 'px';
  35. btnIframeBody.appendChild(wrapper);
  36. if (btnIframeBody.parentNode) {
  37. btnIframeBody.parentNode.style.width = w + 'px';
  38. btnIframeBody.parentNode.style.height = w + 'px';
  39. }
  40. var form = btnIframeDoc.getElementById('edui_form_' + timestrap);
  41. var input = btnIframeDoc.getElementById('edui_input_' + timestrap);
  42. var iframe = btnIframeDoc.getElementById('edui_iframe_' + timestrap);
  43. domUtils.on(input, 'change', function(){
  44. if(!input.value) return;
  45. var loadingId = 'loading_' + (+new Date()).toString(36);
  46. var params = utils.serializeParam(me.queryCommandValue('serverparam')) || '';
  47. var imageActionUrl = me.getActionUrl(me.getOpt('imageActionName'));
  48. var allowFiles = me.getOpt('imageAllowFiles');
  49. me.focus();
  50. me.execCommand('inserthtml', '<img class="loadingclass" id="' + loadingId + '" src="' + me.options.themePath + me.options.theme +'/images/spacer.gif">');
  51. function callback(){
  52. try{
  53. var link, json, loader,
  54. body = (iframe.contentDocument || iframe.contentWindow.document).body,
  55. result = body.innerText || body.textContent || '';
  56. json = (new Function("return " + result))();
  57. link = me.options.imageUrlPrefix + json.url;
  58. if(json.state == 'SUCCESS' && json.url) {
  59. loader = me.document.getElementById(loadingId);
  60. domUtils.removeClasses(loader, 'loadingclass');
  61. loader.setAttribute('src', link);
  62. loader.setAttribute('_src', link);
  63. loader.setAttribute('alt', json.original || '');
  64. loader.removeAttribute('id');
  65. } else {
  66. showErrorLoader && showErrorLoader(json.state);
  67. }
  68. }catch(er){
  69. showErrorLoader && showErrorLoader(me.getLang('simpleupload.loadError'));
  70. }
  71. form.reset();
  72. domUtils.un(iframe, 'load', callback);
  73. }
  74. function showErrorLoader(title){
  75. if(loadingId) {
  76. var loader = me.document.getElementById(loadingId);
  77. loader && domUtils.remove(loader);
  78. me.fireEvent('showmessage', {
  79. 'id': loadingId,
  80. 'content': title,
  81. 'type': 'error',
  82. 'timeout': 4000
  83. });
  84. }
  85. }
  86. /* 判断后端配置是否没有加载成功 */
  87. if (!me.getOpt('imageActionName')) {
  88. errorHandler(me.getLang('autoupload.errorLoadConfig'));
  89. return;
  90. }
  91. // 判断文件格式是否错误
  92. var filename = input.value,
  93. fileext = filename ? filename.substr(filename.lastIndexOf('.')):'';
  94. if (!fileext || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) {
  95. showErrorLoader(me.getLang('simpleupload.exceedTypeError'));
  96. return;
  97. }
  98. domUtils.on(iframe, 'load', callback);
  99. form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?':'&') + params);
  100. form.submit();
  101. });
  102. var stateTimer;
  103. me.addListener('selectionchange', function () {
  104. clearTimeout(stateTimer);
  105. stateTimer = setTimeout(function() {
  106. var state = me.queryCommandState('simpleupload');
  107. if (state == -1) {
  108. input.disabled = 'disabled';
  109. } else {
  110. input.disabled = false;
  111. }
  112. }, 400);
  113. });
  114. isLoaded = true;
  115. });
  116. btnIframe.style.cssText = btnStyle;
  117. containerBtn.appendChild(btnIframe);
  118. }
  119. return {
  120. bindEvents:{
  121. 'ready': function() {
  122. //设置loading的样式
  123. utils.cssRule('loading',
  124. '.loadingclass{display:inline-block;cursor:default;background: url(\''
  125. + this.options.themePath
  126. + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n' +
  127. '.loaderrorclass{display:inline-block;cursor:default;background: url(\''
  128. + this.options.themePath
  129. + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' +
  130. '}',
  131. this.document);
  132. },
  133. /* 初始化简单上传按钮 */
  134. 'simpleuploadbtnready': function(type, container) {
  135. containerBtn = container;
  136. me.afterConfigReady(initUploadBtn);
  137. }
  138. },
  139. outputRule: function(root){
  140. utils.each(root.getNodesByTagName('img'),function(n){
  141. if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) {
  142. n.parentNode.removeChild(n);
  143. }
  144. });
  145. },
  146. commands: {
  147. 'simpleupload': {
  148. queryCommandState: function () {
  149. return isLoaded ? 0:-1;
  150. }
  151. }
  152. }
  153. }
  154. });