Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 고양이 사진 검색기
- 이벤트 수식어
- Vue
- nextjs사용법
- 폼 입력 바인딩
- 쌓임맥락
- react next
- SCSS import
- flex
- postcss
- SCSS use
- vuex map
- 프로그래머스 데브코스 프론트엔드
- SCSS forward
- KDT 프로그래머스 데브코스 프론트엔드
- Spacer
- 프로그래머스 프론트엔드 데브코스
- netlify redirect
- KDT 프로그래머스
- 프로그래머스 데브코스
- 다른컴퓨터에서 git사용
- SCSS extend
- intersection opserver
- vue mixin
- vue 이벤트 수신
- 리액트
- git 같은계정 다른 컴퓨터
- 리스트 렌더링
- 프로그래머스 K_Digital Training
- vue 지역 컴포넌트
Archives
- Today
- Total
혼자 적어보는 노트
[React] 이미지 업로드 시 이미지 압축 본문
이미지 업로드시 이미지 압축
프로젝트 리팩토링을 하는 과정에서 이미지를 등록할 때 제한이 없었어서 용량 제한을 걸어주었었다.
하지만 사용자 입장에서 불편함이 느껴져서 차라리 사용자는 자유롭게 업로드를 하고
프론트에서 압축을 해서 서버에 보내주는 방법으로 변경을 하게 되었다.
browser-image-compression 라이브러리 사용
const actionImgCompress = async (fileSrc) => {
const options = {
maxSizeMB: 1,
maxWidthOrHeight: 1920,
useWebWorker: true,
};
try {
return await imageCompression(fileSrc, options);
} catch (error) {
alert(error);
}
};
const handleFileChange = async (e) => {
let fileBlob = e.target.files[0];
if (!fileBlob) {
return;
}
// 1MB 보다 크다면 변환
if (fileBlob.size > 1024 * 1024) {
fileBlob = await actionImgCompress(fileBlob); // Blob 파일
}
const reader = new FileReader();
reader.readAsDataURL(fileBlob);
reader.onload = () => {
setImageSrc(reader.result); // preview 이미지
onChange(reader.result);
};
};
옵션 값을 정해주고 파일의 src와 지정한 옵션을 전달해주면 압축된 Blob파일로 돌려준다.
미리보기 이미지를 위해 Blob파일을 text로된 Base64코드로 변환해주어야 하는데,
FileReader의 readAsDataUrl을 이용하여 변환할 수 있다.
* 참고로 Blob파일로 변환할 땐 비동기로 변환되기 때문에 await을 사용해주어야 한다.
'React' 카테고리의 다른 글
[React] Emotion CSS 사용 (0) | 2022.07.10 |
---|---|
[React] 아이폰 HEIC 이미지 JPEG로 변환 (0) | 2022.07.08 |
[Redux] Redux-Persist (0) | 2022.06.27 |
[React] 리액트에서 디바운싱 구현하기 (0) | 2022.03.14 |
[React] useRef() 여러 개 한번에 관리하기 (0) | 2022.03.11 |
Comments