본문 바로가기
javascript

html2canvas CORS 우회하기

by hjcode 2022. 12. 11.

 

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

문제는 이미지들이 다른 서버에서 가져온 이미지여서 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에 넣어서 파일로 내려받을 수 있게 처리했다

반응형

'javascript' 카테고리의 다른 글

memoize  (0) 2023.03.22
브라우저에서 '사이트에서 나가시겠습니까?' 표시하는 방법  (0) 2023.02.09
JSDoc  (0) 2022.08.30
setTimeout + async/await로 sleep  (0) 2022.06.28
for loop 에서 우선순위 찾기  (0) 2022.06.09