J'essaye toujours d'enrouler ma tête autour de ça.
Je peux demander à l'utilisateur de sélectionner le fichier (ou même plusieurs) avec l'entrée de fichier:
<form>
<div>
<label>Select file to upload</label>
<input type="file">
</div>
<button type="submit">Convert</button>
</form>
Et je peux attraper l' submit
événement en utilisant <fill in your event handler here>
. Mais une fois que je le fais, comment envoyer le fichier en utilisant fetch
?
fetch('/files', {
method: 'post',
// what goes here? What is the "body" for this? content-type header?
}).then(/* whatever */);
javascript
fetch-api
deitch
la source
la source
Content-Type: multipart/form-data
dans l'en-tête de la demandeRéponses:
Ceci est un exemple de base avec des commentaires. La
upload
fonction est ce que vous recherchez:la source
Je l'ai fait comme ça:
la source
FormData
objet si tout ce que vous téléchargez est le fichier (ce que veut la question d'origine).fetch
accepterainput.files[0]
ci-dessus commebody
paramètre.Une note importante pour l'envoi de fichiers avec Fetch API
Il faut omettre l'en-
content-type
tête pour la requête Fetch. Ensuite, le navigateur ajoutera automatiquement l'en-Content type
tête, y compris la limite du formulaire qui ressemble àLa limite du formulaire est le délimiteur des données du formulaire
la source
Si vous voulez plusieurs fichiers, vous pouvez utiliser ceci
la source
Pour soumettre un seul fichier, vous pouvez simplement utiliser l'
File
objet du tableau deinput
's.files
directement comme valeur debody:
dans votrefetch()
initialiseur:Cela fonctionne car
File
hérite deBlob
etBlob
est l'un desBodyInit
types autorisés définis dans la norme Fetch.la source
body: myInput.files[0]
cause-t-il la quantité d'octets conservés en mémoire côté client?express-fileupload
échec de l'analyse du flux de demandes. MaisFormData
fonctionne comme un charme.express-fileupload
c'est une bibliothèque côté serveur pour gérer lesmultipart/form-data
requêtes contenant des fichiers, donc oui, ce n'est pas compatible avec cette approche (qui envoie juste directement le fichier en tant que corps de la requête).La réponse acceptée ici est un peu datée. À partir d'avril 2020, une approche recommandée vue sur le site Web de MDN suggère d'utiliser
FormData
et ne demande pas non plus de définir le type de contenu. https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_FetchJe cite l'extrait de code pour plus de commodité:
la source
FormData
ne fonctionnera que si le serveur attend des données de formulaire. Si le serveur veut un fichier brut comme corps du POST, la réponse acceptée est correcte.Sauter de l'approche d'Alex Montoya pour plusieurs éléments d'entrée de fichier
la source
Le problème pour moi était que j'utilisais un response.blob () pour remplir les données du formulaire. Apparemment, vous ne pouvez pas faire cela au moins avec React Native, alors j'ai fini par utiliser
Fetch semble reconnaître ce format et envoyer le fichier vers lequel pointe l'URI.
la source
Voici mon code:
html:
la source