← 전체 글로 돌아가기

웹 개발

파일 업로드가 안 될 때 확인하는 것들

업로드 실패는 프런트, 요청 헤더, 서버 제한 중 어디서든 날 수 있다. curl로 끊어서 확인하는 순서를 정리했다.

파일 업로드가 안 될 때는 원인이 프런트엔드일 수도, 요청 형식일 수도, 서버 제한일 수도 있다. 한 화면만 봐서는 어디서 막혔는지 모른다. 그래서 나는 요청을 끊어서 확인한다.

요청 형식부터 본다

업로드는 보통 multipart/form-data로 보내야 한다. 그런데 Content-Type을 직접 application/json으로 박아두거나, fetch에서 FormData를 쓰면서 헤더를 수동으로 지정해 경계 문자열(boundary)을 깨먹는 실수가 흔하다.

const form = new FormData();
form.append("file", file);
// Content-Type을 직접 지정하지 않는다. 브라우저가 boundary까지 붙여준다.
fetch("/api/upload", { method: "POST", body: form });

curl로 서버만 따로 때려본다

프런트를 빼고 서버가 받는지 직접 확인하면 범위가 절반으로 준다.

curl -i -X POST https://example.com/api/upload \
  -H "Authorization: Bearer $TOKEN" \
  -F "file=@./test.png"

-i로 응답 헤더와 상태 코드를 본다. 401이면 인증, 413이면 용량 제한, 415면 타입 문제다.

용량 제한을 확인한다

413(Payload Too Large)이 나오면 앱 코드가 아니라 그 앞단을 본다. nginx면 client_max_body_size, 프레임워크면 바디 파서의 limit 설정이다. 인증 상태와 용량 제한, 이 둘만 먼저 걸러도 대부분의 업로드 실패는 원인이 좁혀졌다.