Skip to main content

[JavaScript] base64로 인코딩된 이미지를 file object로 변환하기

· 2 min read

base64로 인코딩된 이미지 파일을 file object로 변환하기 위해서는 먼저 blob으로 변환 후에 formData에 담아서 파일로 변환

export default {
/**
* 전달받은 이미지를 base64로 인코딩한다
* @param file - 이미지 파일 또는 이미지 URL
* @param maxWidth - 인코딩 시의 이미지 max width 사이즈
* @returns {Promise<any>}
*/
encode(file, maxWidth) {
const re = new RegExp('.(gif|jpg|jpeg|tiff|png|ico)$', 'i');
let name = /[^(/|\\)]*$/.exec(url)[0];
let type = re.test(name) ? re.exec(name)[0].replace('.', '') : 'jpg';

return new Promise((resolve, reject) => {
let image = new Image();

image.onload = function (event) {
let canvas = document.createElement('canvas');
// draw canvas
canvas.width = image.naturalWidth;
canvas.height = image.naturalHeight;
canvas.getContext('2d').drawImage(image, 0, 0);

let dataUrl = canvas.toDataURL('image/' + type);
resolve({
name: name,
type: type,
dataUrl: dataUrl.split(',')[1],
});
};
image.onerror = function () {
let msg = `"${file}"을 로딩하는 데 오류가 발생하였습니다. 이미지 파일을 확인해주세요.`;
alert(msg);
console.error(msg);
};
image.crossOrigin = 'anonymous';
image.src = url;
});
},
/**
* 이미지 url을 blob 파일로 변환하여 전달한다
* @param url
* @returns {Promise<any>}
*/
toBlob(url) {
return new Promise((resolve, reject) => {
this.encode(url).then((res) => {
let byteString = atob(res.dataUrl);
let ab = new ArrayBuffer(byteString.length);
let ia = new Uint8Array(ab);

for (let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}

// write the array buffer to blob
let blob = new Blob([ab], { type: 'image/' + res.type });

let formData = new FormData();
formData.append('file', blob, res.name);
resolve(formData.get('file'));
});
});
},
};

예제

See the Pen image url to file by gloria (@gloriaJun) on CodePen.