나는 여전히 내 머리를 감싸려고합니다.
사용자가 파일 입력으로 파일 (또는 여러 개)을 선택할 수 있습니다.
<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-type
Fetch 요청을 위해 헤더 를 생략해야합니다 . 그런 다음 브라우저는 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 })