plupload.config.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. let thumbList = [];
  2. let thumbLength = 0;
  3. let uploaderFuncUrl = (top.BASE_URL + "");
  4. let $parent = (top || top.parent);
  5. let uploader = new plupload.Uploader({
  6. runtimes: "html5,html4,silverlight,flash",
  7. browse_button: "image-upload",
  8. container: "container",
  9. chunk_size: "10000kb",
  10. unique_names: false,
  11. selected_files: 8, // 한번에 선택한 파일 개수
  12. max_files: 30, // 전체 파일 개수 제한
  13. urlstream_upload: true,
  14. multi_selection: true,
  15. multipart_params: [],
  16. url: uploaderFuncUrl,
  17. flash_swf_url: $parent.tinyMCE.baseURL + '/plupload/js/Moxie.swf',
  18. silverlight_xap_url: $parent.tinyMCE.baseURL + '/plupload/js/Moxie.xap',
  19. resize: {
  20. // width: $parent.tinyMCE.activeEditor.getContainer().offsetWidth,
  21. // height: $parent.tinyMCE.activeEditor.getContainer().offsetHeight,
  22. crop: false,
  23. quality: 100
  24. },
  25. filters: {
  26. max_file_size: "10mb",
  27. mime_types: [{
  28. title: "Image files",
  29. extensions: "jpg,gif,png,bmp"
  30. }],
  31. prevent_duplicates: true
  32. },
  33. init:
  34. {
  35. // 초기 설정
  36. PostInit: function (up) {
  37. if (up.state !== 1) {
  38. $parent.message("잠시후 다시 시도해주세요.", "error");
  39. return false;
  40. }
  41. document.getElementsByClassName("picker-content")[0].innerHTML = "";
  42. $(".picker-content").sortable({
  43. start: function (event, ui) {
  44. ui.placeholder.css({visibility: 'visible', border: '1px solid #4D88FF'});
  45. },
  46. change: function (event, ui) {
  47. ui.placeholder.css({visibility: 'visible', border: '1px solid #4D88FF'});
  48. },
  49. stop: function (event, ui) {
  50. sortFiles();
  51. }
  52. }).disableSelection();
  53. },
  54. // 파일 필터 중
  55. FileFiltered: function (up, files) {
  56. if (!files) {
  57. up.removeFile(files);
  58. $parent.message("사진를 추가할 수 없습니다. 다시 시도 해주세요.", "error");
  59. return false;
  60. }
  61. },
  62. // 업로드 전 보낼 값 지정
  63. BeforeUpload: function (up, file) {
  64. up.settings.multipart_params = {fileID: file.id};
  65. },
  66. // 파일 가상추가
  67. // up.state (1 : stoped, 2: started) plupload resize
  68. FilesAdded: function (up, files) {
  69. if (files.length > up.settings.selected_files) {
  70. $parent.message("사진는 한번에 " + up.settings.selected_files + "개까지 올릴 수 있습니다.", "error");
  71. return false;
  72. }
  73. // 최대 업로드 가능 개수
  74. plupload.each(files, function (file) {
  75. try {
  76. if (file.getSource().getSource().size <= 0) {
  77. throw new Error("파일 형식이 옳지 않습니다.");
  78. } else if (up.files.length > up.settings.max_files) {
  79. throw new Error("사진는 최대 " + up.settings.max_files + "개 까지 가능합니다.");
  80. }
  81. } catch (error) {
  82. $parent.popMessage(error.message, "error");
  83. up.removeFile(file);
  84. up.refresh();
  85. return false;
  86. }
  87. if (up.state !== plupload.STARTED) {
  88. let preView = new moxie.image.Image();
  89. let params = up.settings.resize;
  90. let blob = file.getSource();
  91. try { // mOxie 미리보기 생성
  92. preView.onload = function () // 이미지 썸네일 생성
  93. {
  94. /*
  95. console.log("params.width: " + params.width);
  96. console.log("params.width: " + params.height);
  97. console.log("this.width: " + this.width);
  98. console.log("this.width: " + this.height);
  99. console.log("params.preserve_headers: " + params.preserve_headers);
  100. console.log("params.crop: " + params.crop);
  101. */
  102. if ((params.width > this.width) && (params.preserve_headers && !params.crop)) {
  103. } else {
  104. preView.downsize(params.width, params.height, params.crop, params.preserve_headers); // 크기가 지정한 값보다 크다면 조절
  105. }
  106. paintImg(file, preView.getAsDataURL(blob.type, params.quality));
  107. };
  108. preView.onresize = function (e) {
  109. $parent.popMessage("`" + e.target.name + "` 이미지는 허용 가능한 크기를 초과해 재조정하였습니다.", "warning");
  110. };
  111. preView.onerror = function () {
  112. this.destroy();
  113. };
  114. preView.onloadend = function () {
  115. this.destroy();
  116. };
  117. preView.load(blob);
  118. // 미리보기 생성이 안된다면
  119. if (file.type === "image/gif" && preView.size <= 0) {
  120. var reader = new FileReader();
  121. reader.onloadend = function () {
  122. if (reader.result) {
  123. paintImg(file, reader.result);
  124. }
  125. };
  126. reader.readAsDataURL(file.getNative());
  127. }
  128. } catch (e) {
  129. $parent.popMessage("`" + e.target.name + "` 이미지는 첨부할 수 없습니다.", "error");
  130. return false;
  131. }
  132. }
  133. });
  134. up.refresh();
  135. },
  136. // 업로드 중..
  137. UploadProgress: function (up, files) {
  138. loading();
  139. },
  140. // 실제 사진 업로드
  141. FileUploaded: function (up, file, response) { // 사용안함
  142. var data = JSON.parse(response.response);
  143. try {
  144. if (typeof data != "undefined" && data != "") {
  145. if (file.id && up.state == plupload.STARTED) {
  146. var editorHTML = "<img src='" + data.imageUrl + "?" + Date.now() + "' alt='" + data.imageName + "'/><br /> \u200C";
  147. $parent.tinymce.activeEditor.execCommand('mceInsertContent', false, editorHTML);
  148. // 이미지 번호 저장
  149. /*
  150. if(typeof data.imageID != "undefined" || data.imageID == null){
  151. $parent.setImageID(data.imageID);
  152. }*/
  153. } else {
  154. throw new Error("사진 업로드 중 오류가 발생하였습니다. 다시 시도해주세요.");
  155. }
  156. } else {
  157. throw new Error("첨부한 사진은 사용할 수 없습니다. 다른 사진을 사용해주세요.");
  158. }
  159. } catch (error) {
  160. $parent.message(error.message, "error");
  161. up.removeFile(file);
  162. up.splice(file);
  163. return false;
  164. }
  165. },
  166. FilesRemoved: function(up, files) {
  167. console.log(up);
  168. console.log(files);
  169. },
  170. // 모든 사진 업로드 완료
  171. UploadComplete: function (up, files) {
  172. if (up.total.queued == 0 && up.files.length > 0) {
  173. $parent.message(up.files.length + "개의 사진이 추가 되었습니다.");
  174. }
  175. stopUploader();
  176. },
  177. // 오류 노출
  178. Error: function (up, error) {
  179. if (error.code == 9999) {
  180. $parent.message("\nError #" + error.code + ": " + error.message, "error");
  181. }
  182. return false;
  183. }
  184. }
  185. });
  186. uploader.init();
  187. /*
  188. * Tinymce 내부 호출
  189. */
  190. window.startUploader = function () {
  191. if (uploader.files.length > 0) {
  192. uploader.start();
  193. } else {
  194. stopUploader();
  195. }
  196. };
  197. window.stopUploader = function () {
  198. setTimeout(function () {
  199. uploader.refresh();
  200. uploader.stop();
  201. uploader.unbindAll();
  202. uploader.destroy();
  203. }, 1000);
  204. setTimeout(function () {
  205. $parent.selfAutoResize(15);
  206. }, 0);
  207. setTimeout(function () {
  208. $parent.tinymce.activeEditor.load();
  209. }, 500);
  210. // setTimeout(function(){$parent.tinymce.activeEditor.execCommand('mceAutoResize', true);}, 1000);
  211. loading();
  212. $parent.tinyMCE.activeEditor.windowManager.close();
  213. };
  214. window.insertContent = function () {
  215. if (thumbLength > 0) {
  216. loading();
  217. for (let index in thumbList) {
  218. $parent.tinymce.activeEditor.execCommand('mceInsertContent', false, thumbList[index]);
  219. }
  220. $parent.message(thumbLength + "개의 사진이 추가 되었습니다.");
  221. }
  222. stopUploader();
  223. };
  224. window.removeThumb = function (e) {console.log(333);
  225. if ($(".picker-list-box").length <= 0) {
  226. $parent.popMessage("삭제할 파일이 없습니다.", "warning");
  227. return false;
  228. } else {
  229. if (typeof e != "undefined") {
  230. if (confirm("지워진 사진은 복구할 수 없습니다.\n\n해당 사진을 삭제하겠습니까?")) {
  231. let removeTab = e.closest(".picker-list-box");
  232. let fileID = removeTab.attr("id");
  233. delete thumbList[fileID];
  234. removeTab.remove();
  235. uploader.removeFile(uploader.getFile(fileID));
  236. $parent.popMessage("해당 사진이 정상적으로 삭제 되었습니다.");
  237. thumbLength--;
  238. }
  239. } else {
  240. if (confirm("지워진 사진들은 복구할 수 없습니다.\n\n모든 사진을 삭제하겠습니까?")) {
  241. uploader.splice(); // 초기화
  242. uploader.refresh();
  243. $(".picker-content").empty();
  244. thumbLength = 0;
  245. thumbList = new Array(); // 삭제
  246. $parent.popMessage("모든 사진이 정상적으로 삭제 되었습니다.");
  247. }
  248. }
  249. return true;
  250. }
  251. };
  252. /*
  253. * Plupload 내부 호출
  254. */
  255. var sortFiles = function () {
  256. let fileListObj = $(".picker-list-box");
  257. let tmpFileList = [];
  258. let tmpThumbList = [];
  259. $.each(fileListObj, function (index) {
  260. if (typeof this.id != "undefined") {
  261. tmpFileList.push(uploader.getFile(this.id));
  262. tmpThumbList[this.id] = thumbList[this.id];
  263. }
  264. });
  265. $.each(uploader.files, function (index) {
  266. uploader.files[index] = tmpFileList[index];
  267. });
  268. thumbList = tmpThumbList;
  269. uploader.refresh();
  270. };
  271. var loading = function () {
  272. // 레이어 팝업 기능
  273. let temp = $('.wrap-loading');
  274. let bg = temp.prev(); // dimmed 레이어를 감지하기 위한 boolean 변수
  275. if (bg) {
  276. $('.layer').show(); // 'bg' 클래스가 존재하면 레이어가 나타나고 배경은 dimmed 된다.
  277. temp.show();
  278. } else {
  279. $('.layer').hide();
  280. temp.hide();
  281. }
  282. // 화면의 중앙에 레이어를 띄운다.
  283. if (temp.outerHeight() < $(document).height()) {
  284. temp.css('margin-top', '-' + (temp.outerHeight() / 2 - 26) + 'px');
  285. } else {
  286. temp.css('top', '0');
  287. }
  288. if (temp.outerWidth() < $(document).width()) {
  289. temp.css('margin-left', '-' + (temp.outerWidth() / 2 - 25) + 'px');
  290. } else {
  291. temp.css('left', '0');
  292. }
  293. };
  294. var paintImg = function (file, src) {
  295. let imgHTML = '<img src="' + src + '" alt="' + file.name + '" aria-label="Image" data-load-type="valign" data-target="thumb"/>';
  296. let thumbHTML =
  297. '<div class="picker-list-box picker-sortable-item active" id="' + file.id + '">' +
  298. '<div class="picker-list-item">' +
  299. '<div class="picker-list-item-in">' +
  300. '<div class="picker-image-box">' +
  301. '<a class="picker-image" href="#" onclick="return false;" aria-label="Enlarge">' +
  302. imgHTML +
  303. '</a>' +
  304. '</div>' +
  305. '<a class="picker-image-title picker-image-draggable" href="#" onclick="return false;" aria-label="Name">' + file.name + '</a>' +
  306. '<button type="button" class="picker-image-remove mce-close" aria-hidden="true" aria-label="Remove">' +
  307. '<i class="mce-ico mce-i-remove"></i>' +
  308. '</button>' +
  309. '</div>' +
  310. '</div>' +
  311. '</div>';
  312. document.getElementsByClassName("picker-content")[0].innerHTML += thumbHTML;
  313. thumbList[file.id] = "<br/>" + imgHTML; // 썸네일 이미지 임시저장 (에디터에 뿌려줌)
  314. thumbLength++;
  315. };
  316. var resizeImage = function (blob, params, cb) {
  317. let img = new o.Image();
  318. try {
  319. img.onload = function () {
  320. // no manipulation required if...
  321. if (params.width > this.width &&
  322. params.height > this.height &&
  323. params.quality === undef &&
  324. params.preserve_headers &&
  325. !params.crop
  326. ) {
  327. this.destroy();
  328. return cb(blob);
  329. }
  330. // otherwise downsize
  331. img.downsize(params.width, params.height, params.crop, params.preserve_headers);
  332. console.log(img.getAsDataURL());
  333. paintImg(blob, img.getAsDataURL());
  334. };
  335. img.onresize = function () {
  336. cb(this.getAsBlob(blob.type, params.quality));
  337. this.destroy();
  338. };
  339. img.onerror = function () {
  340. cb(blob);
  341. };
  342. img.load(blob);
  343. } catch (ex) {
  344. cb(blob);
  345. }
  346. }