javascript 파일업로드(formdata)

Javascript 파일업로드하기

file은 json에 포함될 수가 없어서 javascript로 파일업로드를 할때는 Formdata를 사용해서 업로드를 한다.

<input type="file" onChange={handleChane}/>

const handleChane = (e) =>{
  const formData = new FormData();
  formData.append('file', e.target.files[0]);
}

file type의 input에서 onChangeevent로 파일업로드를 다룰 수 있다.

input으로 파일 첨부시 e.target.files[0]에 파일값이 담기게 된다.

생성자 함수로 새로운 FormData 객체를 만들어주고 거기에 .append()해주면 되는 데 꼭 keyvalue를 쌍으로 넣어줘야 하고 첫번째 인자로 key값, 두번째 인자로 value값을 넣어주면 된다.

위 코드에서는 file이라는 키에 e.target.files[0]를 넣어주었다.

파일을 서버에 넘겨주기 위해서는 이렇게 formdata로 파일을 말아서 보내야 한다.

그리고 이때 headersContent-Typemultipart/form-data로 보내야 한다.

const axiosService = axios.create({
    ...
    headers: {
      ...
      'Content-Type': 'multipart/form-data',
      ...
    },
  });

여러 파일 업로드 하기

여러개의 파일을 업로드 할 때는 같은 키값으로 하나하나 반복해서 file을 append 시켜주면 된다.

const formData = new FormData();
for (let i = 0; i < files.length; i++) {
    formData.append('files', files[i]);
}

//or

const formData = new FormData();
formData.append('file', file1);
formData.append('file', file2);

파일과 json을 같이 업로드 하기

파일 업로드와 함께 여러 데이터를 업로드를 해야할 때가 있다.

글을 생성 혹은 수정할 때 이미지 파일과 다른 정보를 한번에 저장해야 하는 경우.

이럴 경우 위 여러 파일 업로드처럼 json을 formdata에 append 시켜주면 되는 데 json파일은 application/json 형식으로 보내야 해서 Blob을 사용한다.

const formData = new FormData();
formData.append('file',  e.target.files[0]);
formData.append('key', new Blob([JSON.stringify(data.info)], { type: "application/json" }));

내가 했던 작업은 두개의 이미지 파일과 하나의 json 파일을 업로드 해야 해서 아래와 같이 작업했다.

const formData = new FormData();
formData.append('image1',  file1);
formData.append('image2',  file2);
formData.append('json', new Blob([JSON.stringify(data)], { type: "application/json" }));

그럼 서버에

{
  image1 : file1
  image2 : file2
  json : data
}

fomdata 형식으로 보내지게 된다.

Discussion and feedback