javascript

html2canvas CORS 우회하기

hjcode 2022. 12. 11. 23:09

 

화면과 같이 드래그해서 이미지들을 캡쳐해서 서버에 다운로드 시키는 기능이 있었다.

문제는 이미지들이 다른 서버에서 가져온 이미지여서 html2canvas로 canvas로 

변환할때 CORS오류가 나는 것이였다.
원본데이터가 오염 및 안전하지 않다고 판단하여 js에서 오류가 발생한 것이다.

 

https://developer.mozilla.org/ko/docs/Web/HTML/CORS_enabled_image

 

교차 출처 이미지와 캔버스 허용하기 - HTML: Hypertext Markup Language | MDN

HTML은 이미지 처리를 위해 CORS header를 포함하고 있는 crossorigin 속성을 제공합니다. 이는 <img> 요소에서 정의된, 외부 origin으로 부터 가져오는 이미지가 <canvas>에서 사용할 수 있도록 해줍니다. 마

developer.mozilla.org

 

이러한 문제를 피하기 위해 url이 노출된 데이터를 인코딩 처리해야한다.

 

const getBase64FromUrl = async (url) => {
  const data = await fetch(url);
  const blob = await data.blob();
  return new Promise((resolve) => {
    const reader = new FileReader();
    reader.readAsDataURL(blob); 
    reader.onloadend = function() {
      const base64data = reader.result;   
      resolve(base64data);
    }
  });
}

 

위처럼 인코딩 된 base64 data 데이터를 가져와서 

const dataURLtoFile = (dataUrl, fileName) => {
    let arr = dataUrl.split(','),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);

    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }

    return new File([u8arr], fileName, { type: mime });
};
const formData = new FormData();
formData.append('file', getFile);

파일 객체로 변환해주고 formData에 넣어서 파일로 내려받을 수 있게 처리했다

반응형