제목 그대로, quill js editor에 이미지 붙혀넣기를 할 때를 이용해보겠어요~~
이미지를 외부에서 복사해서 붙혀넣기를 하면 quill에서는 자동으로 base64 형태로 이미지를 binary로 저장 해줍니다.
이것을 my-sql로 저장하게 되면, 우리의 content 및 image는 TEXT 이 기 때문에, base64 형태로 저장된 이미지는 너무 길어서(너무 커서) 저장이 어렵습니다.
그래서 생각한 방법이 일단 붙혀넣기를 하면
const searchSrc = (root) => {
const arr1 = root.split('img').map(v => v.includes('src') === true && v.split("src="));
const arr2 = arr1.map(v => v && v[1]?.split("></p"))
return arr2.map(v => v && v[0].slice(1, v[0]?.length - 1)).filter(v => v !== false);
} // "data:image/png;base64~~~"
searchSrc(quillInstance?.current?.root?.innerHTML).map((v, i) => {
if(v?.length > 1000) { // "data:image/png;base64~~~"는 1000자를 넘어가기 때문에 + base64만 가져오기 위해서
const imgBase64 = v;
const file = DataURIToBlob(imgBase64);
}
})
function DataURIToBlob(dataURI) {
const splitDataURI = dataURI.split(',')
const byteString = splitDataURI[0].indexOf('base64') >= 0 ? atob(splitDataURI[1]) : decodeURI(splitDataURI[1])
const mimeString = splitDataURI[0].split(':')[1].split(';')[0]
const ia = new Uint8Array(byteString.length)
for (let i = 0; i < byteString.length; i++)
ia[i] = byteString.charCodeAt(i)
return new Blob([ia], { type: mimeString })
} // 출처 stackoverflow
const file = DataURIToBlob(imgBase64);
const formData = new FormData();
const nameMaking = `${Math.floor(Math.random() * 3000)}` + '_' + `${new Date().getTime()}`;
formData.append('image', file, nameMaking); //3번째는 filename
dispatch({
type : UPLOAD_IMAGES_REQUEST,
data : formData
})
searchSrc(quillInstance?.current?.root?.innerHTML).map((v, i) => {
if(v?.length > 1000) {
const innerHTML = Base64toServerImage(quillInstance?.current?.root?.innerHTML);
quillInstance.current.root.innerHTML = innerHTML;
}
})
}
function Base64toServerImage(fullstring) {
const changeStr = fullstring.split('>').map(v => {
if(v.includes("<p")) {
return v + '>'
} else if(v.includes("</p")) {
return v + '>'
} else if(v.includes("<img")) {
return false
} else {
return false
} } ).filter(v => v !== false).join('')
return changeStr
} // <p><img ~~~/></p> => <p></p>
이러면 성공~1
네~ jw님 도움이 많이 되었습니다! 그러나 한 가지 질문이 있는데요~ 사진 한 장 올렸을 때는 별 문제없는데 에디터에 여러 장 올릴 때는 InvalidCharacterError: Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.가 뜨더라구요~
const DataURIToBlob = (dataURI) => {
const splitDataURI = dataURI.split(',');
console.log(dataURI);
const byteString = splitDataURI[0].indexOf('base64') >= 0 ? atob(splitDataURI[1]) : decodeURI(splitDataURI[1])
const mimeString = splitDataURI[0].split(':')[1].split(';')[0]
const ia = new Uint8Array(byteString.length)
for (let i = 0; i < byteString.length; i++)
ia[i] = byteString.charCodeAt(i)
이 쪽에서 atob에 문제가 생긴 거 같은데 해결방법이 있나요~?