- 대용량 파일을 효율적으로 업로드하기 위해 기존 파일 업로드 방식을 presigned-url을 통한 업로드 방식으로 교체한다.
- presigned-url은 서버에서 클라이언트에게 제공하는 사전 서명된 URL로, 클라이언트가 직접 스토리지 서비스에 파일을 업로드할 수 있게 한다.
- 이를 통해 서버는 파일 전송 과정에서 발생하는 부하를 최소화하고, 클라이언트는 더욱 빠르게 파일을 업로드할 수 있음.
-
presigned-url 획득
-
서버에 업로드할 파일의 메타데이터를 전달하여 각 청크에 대한 presigned-url 리스트를 획득함.
-
메타데이터 전달: 파일명, 사이즈, 청크 수 등을 서버에 전달함. URL 획득: 서버는 각 청크 업로드에 필요한 presigned-url 배열을 반환함.
-
-
파일을 청크로 분할하여 업로드
- 대용량 파일을 업로드할 때는 파일을 일정한 크기의 청크로 분할하여 병렬로 업로드함. 이를 통해 업로드 시간을 단축하고, 실패한 청크만 재전송할 수 있어 효율적
- 청크 사이즈 설정: CHUNK_SIZE를 정의하여 파일을 분할함.
- 파일 분할: file.slice 메서드를 사용하여 파일을 청크로 분할함.
-
청크 업로드
-
획득한 presigned-url을 사용하여 각 청크를 업로드함. 이때 fetch API를 활용하여 HTTP PUT 요청을 보냄.
-
병렬 업로드: Promise.all을 사용하여 모든 청크를 병렬로 업로드함.
-
에러 처리: 업로드 중 에러가 발생하면 해당 청크의 eTag를 빈 값으로 처리함.
-
-
업로드 완료 처리
- 모든 청크 업로드가 완료되면 서버에 업로드 완료를 알리고, 성공한 청크들의 정보를 전달함.
- 성공한 청크 필터링: eTag가 있는 청크만 모아 parts 배열을 구성함.
- 업로드 완료 알림: 서버에 업로드 완료 혹은 실패를 알리는 API를 호출하여 업로드 결과를 알림
-
업로드 결과 관리
-
여러 파일을 업로드할 때 각 파일의 성공 여부를 관리하기 위해 Promise.allSettled를 사용함.
-
업로드 결과 수집: 각 파일 업로드에 대한 프로미스 결과를 수집함.
-
상태 업데이트: 필요 시 성공/실패한 파일에 대한 Client 상태를 업데이트
-