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é?


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:


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.

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.