[ToastUI Editor] ์ด๋ฏธ์ง ๋ณต์ฌ ๋ถ์ฌ ๋ฃ๊ธฐ ์, ํ์ผ ์ ๋ก๋ ๋ฐ UI์ฒ๋ฆฌ
๊ธฐ์กด์ ์งํ ํ๋ ํ๋ก์ ํธ์์๋ ๊ธ ์์ฑ ์, 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๋ฐ์ดํฐ ์ ์ฒด๊ฐ ๋ค์ด๊ฐ๋ ๊ฒ์ด ์๋, ํ์ผ ๋ค์ด๋ก๋ ๋งํฌ๋ก ๋ค์ด๊ฐ๋๋ก ๋ณ๊ฒฝ๋๋ค.