[javascript] JS fetch API로 파일을 어떻게 업로드합니까?

나는 여전히 내 머리를 감싸려고합니다.

사용자가 파일 입력으로 파일 (또는 여러 개)을 선택할 수 있습니다.

<form>
  <div>
    <label>Select file to upload</label>
    <input type="file">
  </div>
  <button type="submit">Convert</button>
</form>

그리고를 submit사용 하여 이벤트를 잡을 수 있습니다 <fill in your event handler here>. 그러나 일단 내가 한 다음을 사용하여 파일을 보내려면 어떻게해야 fetch합니까?

fetch('/files', {
  method: 'post',
  // what goes here? What is the "body" for this? content-type header?
}).then(/* whatever */);



답변

주석이 포함 된 기본 예입니다. upload기능은 당신이 찾고있는 것입니다 :

// Select your input type file and store it in a variable
const input = document.getElementById('fileinput');

// This will upload the file after having read it
const upload = (file) => {
  fetch('http://www.example.net', { // Your POST endpoint
    method: 'POST',
    headers: {
      // Content-Type may need to be completely **omitted**
      // or you may need something
      "Content-Type": "You will perhaps need to define a content-type here"
    },
    body: file // This is your file object
  }).then(
    response => response.json() // if the response is a JSON object
  ).then(
    success => console.log(success) // Handle the success response object
  ).catch(
    error => console.log(error) // Handle the error response object
  );
};

// Event handler executed when a file is selected
const onSelectFile = () => upload(input.files[0]);

// Add a listener on your input
// It will be triggered when a file will be selected
input.addEventListener('change', onSelectFile, false);


답변

나는 이렇게했다 :

var input = document.querySelector('input[type="file"]')

var data = new FormData()
data.append('file', input.files[0])
data.append('user', 'hubot')

fetch('/avatars', {
  method: 'POST',
  body: data
})


답변

Fetch API로 파일을 전송하기위한 중요한 참고 사항

content-typeFetch 요청을 위해 헤더 를 생략해야합니다 . 그런 다음 브라우저는 Content type다음과 같은 Form Boundary를 포함하여 헤더를 자동으로 추가합니다.

Content-Type: multipart/form-data; boundary=—-WebKitFormBoundaryfgtsKTYLsT7PNUVD

양식 경계는 양식 데이터의 구분 기호입니다.


답변

여러 파일을 원한다면 이것을 사용할 수 있습니다

var input = document.querySelector('input[type="file"]')

var data = new FormData()
for (const file of input.files) {
  data.append('files',file,file.name)
}

fetch('/avatars', {
  method: 'POST',
  body: data
})


답변

하나의 파일을 제출하려면, 당신은 단순히 사용할 수 있습니다 File으로부터 객체 input.files값으로 직접 배열 body:당신의 fetch()초기화 :

const myInput = document.getElementById('my-input');

// Later, perhaps in a form 'submit' handler or the input's 'change' handler:
fetch('https://example.com/some_endpoint', {
  method: 'POST',
  body: myInput.files[0],
});

이는 작동 File상속을에서 Blob, 그리고 Blob허용 중 하나입니다 BodyInit페치 표준에 정의 된 유형.


답변

여기에 허용되는 답변은 약간 날짜가 있습니다. 2020 년 4 월 현재 MDN 웹 사이트에서 볼 수있는 권장 방법은 사용을 제안 FormData하고 내용 유형을 설정하도록 요청하지 않습니다. https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

편의상 코드 스 니펫을 인용하고 있습니다.

const formData = new FormData();
const fileField = document.querySelector('input[type="file"]');

formData.append('username', 'abc123');
formData.append('avatar', fileField.files[0]);

fetch('https://example.com/profile/avatar', {
  method: 'PUT',
  body: formData
})
.then((response) => response.json())
.then((result) => {
  console.log('Success:', result);
})
.catch((error) => {
  console.error('Error:', error);
});


답변

여러 파일 입력 요소에 대한 Alex Montoya의 접근 방식에서 벗어나기

const inputFiles = document.querySelectorAll('input[type="file"]');
const formData = new FormData();

for (const file of inputFiles) {
    formData.append(file.name, file.files[0]);
}

fetch(url, {
    method: 'POST',
    body: formData })