카테고리 없음

fetch를 통해 요청을 날릴때 headers는 쓰지 않기

따따시 2023. 6. 16. 15:14

 

fetch를 통해 post요청을 날리려고 할때 

const fileInput = document.querySelector('#your-file-input') ;
const formData = new FormData();

formData.append('file', fileInput.files[0]);

const options = {
  method: 'POST',
  body: formData,
  // header를 아래처럼 셋팅하면 안된다고 한다
  // headers: {
  //   'Content-Type': 'multipart/form-data',
  // }
};

fetch('your-upload-url', options);

 

 

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryIn312MOjBWdkffIM

올바른 boundary를 설정하려면 명시적으로 'Content-Type' 헤더를 삭제해야 한다.

이 경우 브라우저가 올바른 'boundary'와 함께 자동으로 설정한다.

 

다음 줄을 추가하면 문제가 해결된다. 

 

// 브라우저가 올바른 'boundary'와 함께 추가할 수 있도록 'Content-Type' 헤더를 삭제하기

delete options.headers['Content-Type'];

 

boundary는 multipart/form-data 형식에서 각 필드 데이터의 구분자(delimiter) 역할을 한다.

 

이 구분자는 서버가 요청에서 각 필드의 데이터가 어디서 끝나고 다음 필드의 데이터가 어디서 시작하는지를 알 수 있게 해준다.

GET 요청에서의 '&'와 비슷한 역할을 한다.

 

boundary는 일반적으로 브라우저가 자동으로 생성해주기 때문에 직접 정의할 필요가 없다.

브라우저는 multipart/form-data 형식으로 요청을 보낼 때 각 필드를 구분하기 위한 boundary 값을 자동으로 생성한다.

서버에서 헤더를 삭제해야 하는 이유는, multer 미들웨어를 사용하고 있기 때문

 

 

multer는 multipart/form-data 형식의 요청을 처리하기 위한 미들웨어로, 요청을 해석하고 각 필드의 데이터를 추출한다.

이 과정에서 요청의 헤더가 변경될 수 있으며, 따라서 클라이언트에서 서버로 전송한 헤더 정보는 의미가 없어지므로 삭제된다.

결론적으로, multipart/form-data 형식으로 데이터를 전송할 때는 boundary를 자동으로 생성하고,

서버에서는 요청의 헤더를 삭제하여 요청을 올바르게 처리할 수 있도록 하는 것

 

 

[원문] https://muffinman.io/blog/uploading-files-using-fetch-multipart-form-data/

 

Uploading files using 'fetch' and 'FormData'

Today I learned: To upload files using fetch and FormData (FormData is supported in IE10+.) you must not set Content-Type header. const fileInpu…

muffinman.io