이미지 파일 업로드 코드


const imgUploadRef = useRef<HTMLInputElement>(null);

const handleRegister = (): void => {
    imgUploadRef.current.click();
};

const onImageChange = (event: React.ChangeEvent<HTMLInputElement>): void => {
    const file = event.target.files[0];

    if (file.size > MAX_FILE_SIZE) {
      alert('최대 이미지 용량은 2mb입니다.');
      return;
    }

    if (file) {
      actionImageCompress(file);
    }
};

<Input
      type="file"
      ref={imgUploadRef}
      accept={'image/*'}
      onChange={onImageChange}
/>

<Button type="button" onClick={handleRegister}>
        썸네일 등록
</Button>

Input 태그

type="file" : type file 속성 지정

accept={'image/*'} : "image/*" 유형의 파일만 업로드

ref={imgUploadRef} : input 태그의 display 속성은 none입니다. imgUploadRef로 참조하게 되면

버튼 이벤트 발생시 파일 업로드 창을 띄웁니다. display 속성은 none으로 설정한 이유는 파일 업로드 버튼을 custom하게 사용하기 위해서 입니다.

onChange={onImageChange} : onImageChange 함수가 호출되어 선택한 파일을 처리하고 이미지 미리

보기를 표시하거나 이미지를 서버에 업로드하는 것과 같은 필요한 작업을 수행합니다.

‘browser-image-compression’ 라이브러리를 사용한 함수

업로드 할 파일 크기를 줄여줍니다.

actionImageCompress

const actionImageCompress = async (file) => {
    const options = {
      maxSizeMB: 0.2, // 최대 파일 크기
      maxWidthOrHeight: 1024, // 최대 너비 및 높이
      useWebWorker: true, // webworker 사용 여부
    };
    try {
			// 압축 파일 객체 반환
      const compressedFile = await imageCompression(file, options);

			// 파일의 내용을 읽을 수 있게 해주는 Web API
      const reader = new FileReader();
	     
			// 압축된 이미지 파일을 읽어서 데이터 URL로 변환하여 브라우저에 이미지를 표시하거나 서버에 업로드하는 데 사용
			reader.readAsDataURL(compressedFile);
      reader.onloadend = () => {
        // Base64로 인코딩된 데이터
				const imageData = reader.result;
        dispatch(
          setImageInformation({
						// 화면에 표시될 이미지 URL
            thumbnailImgUrl: URL.createObjectURL(compressedFile),
						// 서버로 보낼 이미지 데이터
            imageData: imageData,
          }),
        );
      };
    } catch (error) {
      alert('잠시 후 다시 시도해주세요');
    }
};