Wciąż staram się owinąć wokół tego głowę.
Mogę poprosić użytkownika o wybranie pliku (lub nawet wielu) za pomocą wejścia pliku:
<form>
<div>
<label>Select file to upload</label>
<input type="file">
</div>
<button type="submit">Convert</button>
</form>
I mogę złapać submit
wydarzenie za pomocą <fill in your event handler here>
. Ale kiedy już to zrobię, jak wysłać plik przy użyciu fetch
?
fetch('/files', {
method: 'post',
// what goes here? What is the "body" for this? content-type header?
}).then(/* whatever */);
javascript
fetch-api
deitch
źródło
źródło
Content-Type: multipart/form-data
w nagłówku żądaniaOdpowiedzi:
To jest podstawowy przykład z komentarzami.
upload
Funkcją jest to, czego szukasz:źródło
Zrobiłem to tak:
źródło
FormData
obiekt, jeśli wszystko, co przesyłasz, to plik (czego chce pierwotne pytanie).fetch
zaakceptujeinput.files[0]
powyższe jako swójbody
parametr.Ważna uwaga dotycząca wysyłania plików za pomocą Fetch API
W
content-type
żądaniu Fetch należy pominąć nagłówek. Następnie przeglądarka automatycznie dodaContent type
nagłówek zawierający wyglądającą granicę formularzaGranica formularza jest ogranicznikiem danych formularza
źródło
Jeśli chcesz mieć wiele plików, możesz użyć tego
źródło
Aby przesłać pojedynczy plik, możesz po prostu użyć
File
obiektu zinput
„s.files
tablicy bezpośrednio jako wartośćbody:
wfetch()
inicjatora:To działa, ponieważ
File
dziedziczy poBlob
iBlob
jest jednym z dopuszczalnychBodyInit
typów zdefiniowanych w Fetch Standard.źródło
body: myInput.files[0]
na ilość bajtów przechowywanych w pamięci po stronie klienta?express-fileupload
nie udało się przeanalizować strumienia żądań. AleFormData
działa jak urok.express-fileupload
jest to biblioteka po stronie serwera do obsługimultipart/form-data
żądań zawierających pliki, więc tak, nie jest zgodna z tym podejściem (które po prostu wysyła plik bezpośrednio jako treść żądania).Przyjęta tutaj odpowiedź jest nieco przestarzała. Od kwietnia 2020 r. Zalecane podejście widoczne na stronie MDN sugeruje użycie,
FormData
ale także nie wymaga ustawiania typu treści.https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_FetchDla wygody cytuję fragment kodu:
źródło
FormData
będzie działać tylko wtedy, gdy serwer oczekuje danych z formularza. Jeśli serwer chce pliku surowego jako treści POST, zaakceptowana odpowiedź jest poprawna.Odejście od podejścia Alexa Montoyi do wielu elementów wejściowych plików
źródło
Problem polegał na tym, że użyłem response.blob () do wypełnienia danych formularza. Najwyraźniej nie możesz tego zrobić przynajmniej z React Native, więc ostatecznie użyłem
Wydaje się, że program Fetch rozpoznaje ten format i wysyła plik wskazany przez uri.
źródło
Oto mój kod:
html:
źródło