๐Ÿ“œJS

[ToastUI Editor] ์ด๋ฏธ์ง€ ๋ณต์‚ฌ ๋ถ™์—ฌ ๋„ฃ๊ธฐ ์‹œ, ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ UI์ฒ˜๋ฆฌ

harry.93 2022. 3. 29. 14:01
๋ฐ˜์‘ํ˜•

๊ธฐ์กด์— ์ง„ํ–‰ ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ธ€ ์ž‘์„ฑ ์‹œ, Toast UI Editor ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. 

๋”ฐ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์€ ์—†์—ˆ๋Š”๋ฐ, ์—๋””ํ„ฐ์—์„œ ๊ธ€ ์ž‘์„ฑ ์‹œ ์—๋””ํ„ฐ ์ž์ฒด ์ง€์›์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๋ฉด blob ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋ง ํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด์žˆ์—ˆ๋‹ค.

ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” blob ๋ฐ์ดํ„ฐ๋กœ ๊ทธ๋Œ€๋กœ DB์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฏธ์ง€๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์–ด๋งˆ์–ด๋งˆ ํ•ด์ง„๋‹ค. ๋ฌผ๋ก  ์ปค์ ธ๋ดค์ž ๊ฐ๋‹น์ด ์•ˆ๋  ์ˆ˜์ค€์€ ์•„๋‹ˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ read ํ•˜์—ฌ ํ™”๋ฉด ๋‹จ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๋กœ๋”ฉ์ด ๊ธธ์–ด์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์€ ์œ ์ง€ํ•˜๋˜, ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜์—ฌ URL์„ BLOB๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ download๋งํฌ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋Œ€์ฒดํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

 

1์ฐจ๋กœ paste ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

document.querySelector("#editor").addEventListener("paste", (e) => {
  var items = (e.clipboardData || e.originalEvent.clipboardData).items;
  for (let i of items) {
    var item = i;
    if (item.type.indexOf("image") != -1) {
      var file = item.getAsFile();
      console.log(file);
      //uploadFile(file);
    }
  }
});

function uploadFile(file) {
  var formData = new FormData();
  formData.append("file", file);
  var vm = this;
  comm.post(
    {
      url: "/file/upload.do",
      processData: false,
      contentType: false,
      headers: {
        "Content-Type": "multipart/form-data",
      },
      params: formData,
    },
    function (data) {
      if (data.resultMsg == "FAIL") {
        return false;
      } else {
        console.log(data);
      }
    }
  );
}

 

ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋กœ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, ์‹คํŒจํ–ˆ๋‹ค.

์ด์œ ๋Š” ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ์‹œ, ์•„๋ฌด๋ฆฌ ์ด๋ฒคํŠธ ์ค‘์ง€๋ฅผ ๊ฑธ์–ด๋„ ๋ถ™์—ฌ๋„ฃ๊ธฐ๊ฐ€ ์‹คํ–‰๋˜์—ˆ๋‹ค. 

์›๋ž˜ ๊ณ„ํš์€ ๋ถ™์—ฌ๋„ฃ๊ธฐ ์ด๋ฒคํŠธ ๋ฐœ์ƒ -> ์ด๋ฒคํŠธ ์ค‘์ง€ -> ํŒŒ์ผ์—…๋กœ๋“œ ํ›„ -> ์ƒˆ๋กœ ๋งŒ๋“  URL ๋ฆฌํ„ด ์ด์—ˆ๋Š”๋ฐ ์•„๋ฌด๋ž˜๋„ ์—๋””ํ„ฐ ๋‚ด์—์„œ ์บก์ณํ•˜์—ฌ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค ๋ณด๋‹ˆ ์™ธ๋ถ€์—์„œ ์Šคํฌ๋ฆฝํŠธ๋กœ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋ง ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๋ฆฌ์˜€๋‹ค.

 

๋”ฐ๋ผ์„œ, ์—๋””ํ„ฐ์—์„œ ์ด๋ฏธ์ง€ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ์‹œ, blob๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„์•ผ ํ–ˆ๋‹ค.

์ฐพ๋Š” ๋ฐฉ๋ฒ•์€ console.log ๋ฅผ ์ฐ์–ด๊ฐ€๋ฉด์„œ ํ˜„์žฌ ์ƒ์„ฑ๋œ ์—๋””ํ„ฐ์—์„œ ์ด๋ฏธ์ง€ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ์‹œ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ call ํ•˜๋Š”์ง€ ์ผ์ผํžˆ ํ…Œ์ŠคํŠธ ํ•˜๋ฉด์„œ ์ฐพ์•˜๋‹ค.

 

toastui editor cdn import file : https://uicdn.toast.com/editor/latest/toastui-editor-all.js

ํ•ด๋‹น ํŒŒ์ผ์—์„œ ์ด๋ฏธ์ง€ ํ•ธ๋“ค๋ง์„ ํ•˜๋Š” ๋ถ€๋ถ„์€ addDefaultImageBlobHook ์ด๋ผ๋Š” ํ•จ์ˆ˜์˜€๋‹ค.

- ๊ธฐ์กด ์†Œ์Šค : 17600 ๋ผ์ธ ๊ทผ์ฒ˜

function addDefaultImageBlobHook(eventEmitter) {
    eventEmitter.listen('addImageBlobHook', function (blob, callback) {
        var reader = new FileReader();
        reader.onload = function (_a) {
            var target = _a.target;
            return callback(target.result);
        };
        
        reader.readAsDataURL(blob);
    });
}

 

์œ„์— ํ•ด๋‹น ํ•˜๋Š” ๋ถ€๋ถ„์„ ํŒŒ์ผ ์—…๋กœ๋“œํ•˜๊ณ , URL๋กœ ๋ณ€๊ฒฝ ๋ฆฌํ„ด ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค.

 

- ๋ณ€๊ฒฝ ์†Œ์Šค

function addDefaultImageBlobHook(eventEmitter) {
    eventEmitter.listen('addImageBlobHook', function (blob, callback) {
        var formData = new FormData();
        formData.append("file", blob);
        comm.post(
          {
            url: "/file/upload.do",
            processData: false,
            contentType: false,
            headers: {
              "Content-Type": "multipart/form-data",
            },
            params: formData,
          },
          function (data) {
            if (data.result.status != "success") {
              return false;
            } else {
              var url = "/file/download.do?seq=" + data.result.fileSeq;
              return callback(url);
            }
          }
        );
        /* var reader = new FileReader();
        reader.onload = function (_a) {
            var target = _a.target;
            return callback(target.result);
        };
        
        reader.readAsDataURL(blob); */
    });
}

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์—๋””ํ„ฐ์— ์ž‘์„ฑ ์‹œ, ์ด๋ฏธ์ง€๋ฅผ ๋ถ™์—ฌ๋„ฃ์„ ๋•Œ BLOB๋ฐ์ดํ„ฐ ์ „์ฒด๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ๋งํฌ๋กœ ๋“ค์–ด๊ฐ€๋„๋ก ๋ณ€๊ฒฝ๋œ๋‹ค.

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•