JavaScript: carica il file


190

Diciamo che ho questo elemento nella pagina:

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

Ciò creerà un pulsante che consente agli utenti della pagina Web di selezionare un file tramite una finestra di dialogo "Apri file ..." nel browser.

Supponiamo che l'utente faccia clic su detto pulsante, selezioni un file nella finestra di dialogo, quindi faccia clic sul pulsante "Ok" per chiudere la finestra di dialogo.

Il nome del file selezionato è ora memorizzato in:

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

Supponiamo ora che il server gestisca i POST in più parti nell'URL "/ upload / image".

Come posso inviare il file a "/ upload / image"?

Inoltre, come ascolto la notifica del completamento del caricamento del file?


2
JavaScript non gestisce i caricamenti perché è lato server. Lo script lato server riceverà il file e quindi lo sposterà. Per php dalla cartella temporanea alla cartella desiderata.
Bakudan,


15
Votato per riaprire perché la domanda riguarda POJS (semplicemente vecchio javascript) e non jQuery.
e2-e4,

Risposte:


95

A meno che tu non stia provando a caricare il file utilizzando ajax, basta inviare il modulo a /upload/image.

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

Se desideri caricare l'immagine in background (ad esempio senza inviare l'intero modulo), puoi utilizzare ajax:


oppure dimensioni iframe 0x0 con lo script di upload delle immagini all'interno di src = "" e invia il modulo utilizzando target = "iframeId" rileggendo il risultato sull'evento iframe src .load che può essere associato ad esempio con jQuery.
Dmitry,

11
Al giorno d'oggi è possibile effettuare l'upgrade tramite Javascript e Ajax, vedere stackoverflow.com/a/10811427/694469 (non ho effettuato il downgrade).
KajMagnus,

35
@KajMagnus, probabilmente volevi dire "upload" ma accidentalmente hai detto "upvote"
Samuel Allan

85

JS puro

Puoi usare fetch facoltativamente con 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});

Approccio alla vecchia scuola - 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);

SOMMARIO

  • Nel lato server è possibile leggere il nome del file originale (e altre informazioni) che viene automaticamente incluso per richiedere dal browser nel filenameparametro formData.
  • NON è necessario impostare l'intestazione della richiesta Content-Typesu multipart/form-data: verrà impostata automaticamente dal browser.
  • Invece di /upload/imagete puoi usare l'indirizzo completo come http://.../upload/image.
  • Se vuoi inviare molti file in una singola richiesta usa l' multipleattributo <input multiple type=... />:, e allega tutti i file scelti a formData in modo simile (es. photo2=...files[2];... formData.append("photo2", photo2);)
  • È possibile includere dati aggiuntivi (json) da richiedere, ad esempio let user = {name:'john', age:34}in questo modo:formData.append("user", JSON.stringify(user));
  • Queste soluzioni dovrebbero funzionare su tutti i principali browser.

Funziona perfettamente per me.
Trieu Nguyen,

formData === invia moduloenctype="multipart/form-data"
xgqfrms

Ricevo un errorenet::ERR_ABORTED 405 (Method Not Allowed)
Hidayt Rahman l'

@HidaytRahman questo errore di solito appare quando serwer non implementa il metodo POST per il tuo url
Kamil Kiełczewski

1
Strano - Secondo la tua voce stavo pensando che non abbiamo più richiesto il server: D
Hidayt Rahman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.