autoupload.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /**
  2. * @description
  3. * 1.拖放文件到编辑区域,自动上传并插入到选区
  4. * 2.插入粘贴板的图片,自动上传并插入到选区
  5. * @author Jinqn
  6. * @date 2013-10-14
  7. */
  8. UE.plugin.register('autoupload', function (){
  9. function sendAndInsertFile(file, editor) {
  10. var me = editor;
  11. //模拟数据
  12. var fieldName, urlPrefix, maxSize, allowFiles, actionUrl,
  13. loadingHtml, errorHandler, successHandler,
  14. filetype = /image\/\w+/i.test(file.type) ? 'image':'file',
  15. loadingId = 'loading_' + (+new Date()).toString(36);
  16. fieldName = me.getOpt(filetype + 'FieldName');
  17. urlPrefix = me.getOpt(filetype + 'UrlPrefix');
  18. maxSize = me.getOpt(filetype + 'MaxSize');
  19. allowFiles = me.getOpt(filetype + 'AllowFiles');
  20. actionUrl = me.getActionUrl(me.getOpt(filetype + 'ActionName'));
  21. errorHandler = function(title) {
  22. var loader = me.document.getElementById(loadingId);
  23. loader && domUtils.remove(loader);
  24. me.fireEvent('showmessage', {
  25. 'id': loadingId,
  26. 'content': title,
  27. 'type': 'error',
  28. 'timeout': 4000
  29. });
  30. };
  31. if (filetype == 'image') {
  32. loadingHtml = '<img class="loadingclass" id="' + loadingId + '" src="' +
  33. me.options.themePath + me.options.theme + '/images/spacer.gif">';
  34. successHandler = function(data) {
  35. var link = urlPrefix + data.url,
  36. loader = me.document.getElementById(loadingId);
  37. if (loader) {
  38. domUtils.removeClasses(loader, 'loadingclass');
  39. loader.setAttribute('src', link);
  40. loader.setAttribute('_src', link);
  41. loader.setAttribute('alt', data.original || '');
  42. loader.removeAttribute('id');
  43. me.trigger('contentchange',loader);
  44. }
  45. };
  46. } else {
  47. loadingHtml = '<p>' +
  48. '<img class="loadingclass" id="' + loadingId + '" src="' +
  49. me.options.themePath + me.options.theme + '/images/spacer.gif">' +
  50. '</p>';
  51. successHandler = function(data) {
  52. var link = urlPrefix + data.url,
  53. loader = me.document.getElementById(loadingId);
  54. var rng = me.selection.getRange(),
  55. bk = rng.createBookmark();
  56. rng.selectNode(loader).select();
  57. me.execCommand('insertfile', {'url': link});
  58. rng.moveToBookmark(bk).select();
  59. };
  60. }
  61. /* 插入loading的占位符 */
  62. me.execCommand('inserthtml', loadingHtml);
  63. /* 判断后端配置是否没有加载成功 */
  64. if (!me.getOpt(filetype + 'ActionName')) {
  65. errorHandler(me.getLang('autoupload.errorLoadConfig'));
  66. return;
  67. }
  68. /* 判断文件大小是否超出限制 */
  69. if(file.size > maxSize) {
  70. errorHandler(me.getLang('autoupload.exceedSizeError'));
  71. return;
  72. }
  73. /* 判断文件格式是否超出允许 */
  74. var fileext = file.name ? file.name.substr(file.name.lastIndexOf('.')):'';
  75. if ((fileext && filetype != 'image') || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) {
  76. errorHandler(me.getLang('autoupload.exceedTypeError'));
  77. return;
  78. }
  79. /* 创建Ajax并提交 */
  80. var xhr = new XMLHttpRequest(),
  81. fd = new FormData(),
  82. params = utils.serializeParam(me.queryCommandValue('serverparam')) || '',
  83. url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params);
  84. fd.append(fieldName, file, file.name || ('blob.' + file.type.substr('image/'.length)));
  85. fd.append('type', 'ajax');
  86. xhr.open("post", url, true);
  87. xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  88. xhr.addEventListener('load', function (e) {
  89. try{
  90. var json = (new Function("return " + utils.trim(e.target.response)))();
  91. if (json.state == 'SUCCESS' && json.url) {
  92. successHandler(json);
  93. } else {
  94. errorHandler(json.state);
  95. }
  96. }catch(er){
  97. errorHandler(me.getLang('autoupload.loadError'));
  98. }
  99. });
  100. xhr.send(fd);
  101. }
  102. function getPasteImage(e){
  103. return e.clipboardData && e.clipboardData.items && e.clipboardData.items.length == 1 && /^image\//.test(e.clipboardData.items[0].type) ? e.clipboardData.items:null;
  104. }
  105. function getDropImage(e){
  106. return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files:null;
  107. }
  108. return {
  109. outputRule: function(root){
  110. utils.each(root.getNodesByTagName('img'),function(n){
  111. if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) {
  112. n.parentNode.removeChild(n);
  113. }
  114. });
  115. utils.each(root.getNodesByTagName('p'),function(n){
  116. if (/\bloadpara\b/.test(n.getAttr('class'))) {
  117. n.parentNode.removeChild(n);
  118. }
  119. });
  120. },
  121. bindEvents:{
  122. defaultOptions: {
  123. //默认间隔时间
  124. enableDragUpload: true,
  125. enablePasteUpload: true
  126. },
  127. //插入粘贴板的图片,拖放插入图片
  128. 'ready':function(e){
  129. var me = this;
  130. if(window.FormData && window.FileReader) {
  131. var handler = function(e){
  132. var hasImg = false,
  133. items;
  134. //获取粘贴板文件列表或者拖放文件列表
  135. items = e.type == 'paste' ? getPasteImage(e):getDropImage(e);
  136. if(items){
  137. var len = items.length,
  138. file;
  139. while (len--){
  140. file = items[len];
  141. if(file.getAsFile) file = file.getAsFile();
  142. if(file && file.size > 0) {
  143. sendAndInsertFile(file, me);
  144. hasImg = true;
  145. }
  146. }
  147. hasImg && e.preventDefault();
  148. }
  149. };
  150. if (me.getOpt('enablePasteUpload') !== false) {
  151. domUtils.on(me.body, 'paste ', handler);
  152. }
  153. if (me.getOpt('enableDragUpload') !== false) {
  154. domUtils.on(me.body, 'drop', handler);
  155. //取消拖放图片时出现的文字光标位置提示
  156. domUtils.on(me.body, 'dragover', function (e) {
  157. if(e.dataTransfer.types[0] == 'Files') {
  158. e.preventDefault();
  159. }
  160. });
  161. } else {
  162. if (browser.gecko) {
  163. domUtils.on(me.body, 'drop', function(e){
  164. if (getDropImage(e)) {
  165. e.preventDefault();
  166. }
  167. });
  168. }
  169. }
  170. //设置loading的样式
  171. utils.cssRule('loading',
  172. '.loadingclass{display:inline-block;cursor:default;background: url(\''
  173. + this.options.themePath
  174. + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n' +
  175. '.loaderrorclass{display:inline-block;cursor:default;background: url(\''
  176. + this.options.themePath
  177. + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' +
  178. '}',
  179. this.document);
  180. }
  181. }
  182. }
  183. }
  184. });