JavaScript: télécharger un fichier

190

Disons que j'ai cet élément sur la page:

<input id="image-file" type="file" />

Cela créera un bouton qui permet aux utilisateurs de la page Web de sélectionner un fichier via une boîte de dialogue OS "Fichier ouvert ..." dans le navigateur.

Supposons que l'utilisateur clique sur ledit bouton, sélectionne un fichier dans la boîte de dialogue, puis clique sur le bouton «Ok» pour fermer la boîte de dialogue.

Le nom de fichier sélectionné est maintenant stocké dans:

document.getElementById("image-file").value

Maintenant, disons que le serveur gère les POST en plusieurs parties à l'URL "/ upload / image".

Comment envoyer le fichier vers "/ upload / image"?

De plus, comment écouter la notification indiquant que le téléchargement du fichier est terminé?

YummyBánhMì
la source
2
JavaScript ne gère pas les téléchargements, car il est côté serveur. Le script côté serveur recevra le fichier, puis le déplacera. Pour php du dossier temporaire vers le dossier souhaité.
Bakudan
15
Voté pour rouvrir parce que la question concerne POJS (javascript brut) et non jQuery.
e2-e4

Réponses:

95

À moins que vous n'essayiez de télécharger le fichier en utilisant ajax, soumettez simplement le formulaire à /upload/image.

<form enctype="multipart/form-data" action="/upload/image" method="post">
    <input id="image-file" type="file" />
</form>

Si vous souhaitez télécharger l'image en arrière-plan (par exemple sans soumettre le formulaire entier), vous pouvez utiliser ajax:

Matt Ball
la source
ou iframe 0x0 size avec le script d'uploader d'image dans son src = "" et postez le formulaire dessus en utilisant target = "iframeId" en lisant le résultat sur l'événement iframe src .load qui peut être lié en utilisant jQuery par exemple.
Dmitry
11
Il est en fait possible de voter via Javascript et Ajax de nos jours, voir: stackoverflow.com/a/10811427/694469 (je n'ai pas voté contre).
KajMagnus
35
@KajMagnus, vous vouliez probablement dire `` télécharger '', mais vous avez accidentellement dit `` vote positif ''
Samuel Allan
85

Pure JS

Vous pouvez utiliser fetch en option avec await-try-catch

let photo = document.getElementById("image-file").files[0];
let formData = new FormData();

formData.append("photo", photo);
fetch('/upload/image', {method: "POST", body: formData});

Approche old school - XHR

let photo = document.getElementById("image-file").files[0];  // file from input
let req = new XMLHttpRequest();
let formData = new FormData();

formData.append("photo", photo);                                
req.open("POST", '/upload/image');
req.send(formData);

RÉSUMÉ

  • Côté serveur, vous pouvez lire le nom du fichier d'origine (et d'autres informations) qui est automatiquement inclus à la demande du navigateur dans le filenameparamètre formData.
  • Vous n'avez PAS besoin de définir l'en-tête de la demande Content-Typesur multipart/form-data- cela sera automatiquement défini par le navigateur.
  • Au lieu de /upload/imagevous pouvez utiliser une adresse complète comme http://.../upload/image.
  • Si vous souhaitez envoyer de nombreux fichiers en une seule requête, utilisez l' multipleattribut <input multiple type=... />:, et attachez tous les fichiers choisis à formData de la même manière (par exemple photo2=...files[2];... formData.append("photo2", photo2);)
  • Vous pouvez inclure des données supplémentaires (json) à demander, par exemple let user = {name:'john', age:34}de cette manière:formData.append("user", JSON.stringify(user));
  • Ces solutions devraient fonctionner sur tous les principaux navigateurs.
Kamil Kiełczewski
la source
Travaille parfaitement pour moi.
Trieu Nguyen
formData === form submitenctype="multipart/form-data"
xgqfrms
Je reçois une erreurnet::ERR_ABORTED 405 (Method Not Allowed)
Hidayt Rahman
@HidaytRahman cette erreur apparaît généralement lorsque le serveur n'implémente pas la méthode POST pour votre url
Kamil Kiełczewski
1
Bizarre - Selon votre titre, je pensais que nous n'avions plus besoin de serveur: D
Hidayt Rahman