HTML: come limitare il caricamento di file in modo che siano solo immagini?


126

Con l'HTML, come faccio a limitare il tipo di tipi di file che possono essere caricati?

Per facilitare l'esperienza dell'utente, voglio limitare i caricamenti di file in modo che siano solo immagini (jpeg, gif, png).

<form method="post" action="..." enctype="multipart/form-data">
<label for="image">Photo</label>
<input name="image" type="file" />
</form>

Ovviamente, per proteggerlo correttamente, controllerei sul lato backend / server. Ma tutto ciò che cerco è un modo per semplificare l'esperienza dell'utente in modo che quando fa clic su "sfoglia" per trovare l'immagine che desidera caricare, non debba vedere tutti quei documenti di parole, ecc. Che non sono applicabili a caricare
JacobT

Non so se puoi impostare una maschera di file. Non l'ho mai visto fare con successo.
Robert K

Risposte:


230

Dice HTML5 <input type="file" accept="image/*">. Ovviamente, non fidarti mai della convalida lato client: controlla sempre di nuovo sul lato server ...


87

L'input del file HTML5 ha un attributo di accettazione e anche un attributo multiplo. Utilizzando più attributi è possibile caricare più immagini in un'istanza.

<input type="file" multiple accept='image/*'>

Puoi anche limitare più tipi MIME.

<input type="file" multiple accept='image/*|audio/*|video/*' >

e un altro modo per controllare il tipo MIME usando l'oggetto file.

oggetto file ti dà nome, dimensione e tipo.

var files=e.target.files;

var mimeType=files[0].type; // You can get the mime type

È inoltre possibile limitare l'utente per alcuni tipi di file da caricare tramite il codice sopra.


4
image/*|audio/*|video/*non funziona per me, dovrebbe essere separato da virgole a quanto pare:image/*,video/mp4,.txt
serg

Ottimo per controllare il mimeType! Tx!
Pedro Ferreira


6

Ecco l'HTML per il caricamento delle immagini. Per impostazione predefinita mostrerà i file di immagine solo nella finestra di navigazione perché abbiamo messo accept="image/*". Ma possiamo ancora cambiarlo dal menu a discesa e mostrerà tutti i file. Quindi la parte Javascript convalida se il file selezionato è o meno un'immagine reale.

 <div class="col-sm-8 img-upload-section">
     <input name="image3" type="file" accept="image/*" id="menu_images"/>
     <img id="menu_image" class="preview_img" />
     <input type="submit" value="Submit" />
 </div> 

Qui sull'evento di modifica per prima cosa controlliamo la dimensione dell'immagine. E nella seconda ifcondizione controlliamo se si tratta o meno di un file immagine.

this.files[0].type.indexOf("image")sarà -1se non è un file immagine.

document.getElementById("menu_images").onchange = function () {
    var reader = new FileReader();
    if(this.files[0].size>528385){
        alert("Image Size should not be greater than 500Kb");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();     
        return false;
    }
    if(this.files[0].type.indexOf("image")==-1){
        alert("Invalid Type");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();         
        return false;
    }   
    reader.onload = function (e) {
        // get loaded data and render thumbnail.
        document.getElementById("menu_image").src = e.target.result;
        $("#menu_image").show(); 
    };

    // read the image file as a data URL.
    reader.readAsDataURL(this.files[0]);
};

Aggiungi una spiegazione per favore.
Paul Swetz

Tieni presente che quanto sopra richiede jquery, ma non lo dice. Abbastanza facile da capire, ma utile da affermare. Ho creato un violino per questo . Fa alcune altre cose (come richiesto per un progetto), ma il concetto è praticamente lo stesso.
Dave Land

2
<script>

    function chng()
    {
        var typ=document.getElementById("fiile").value;
        var res = typ.match(".jp");

        if(res)
        {
            alert("sucess");
        }
        else
        {
            alert("Sorry only jpeg images are accepted");
            document.getElementById("fiile").value="; //clear the uploaded file
        }
    }

</script>

Ora nella parte html

<input type="file" onchange="chng()">

questo codice controllerà se il file caricato è un file jpg o meno e limita il caricamento di altri tipi


Questo controllo viene annullato da una semplice ridenominazione dell'estensione del file. Dovresti almeno controllare il tipo di URI dei dati se hai intenzione di fare qualcosa del genere.
Lucas Leblanc

1

Puoi farlo in modo sicuro solo sul lato server. L'uso dell'attributo "accept" è buono, ma deve anche essere convalidato sul lato server per evitare che gli utenti siano in grado di eseguire il cURL del tuo script senza questa limitazione.

Ti suggerisco di: eliminare qualsiasi file non immagine, avvisare l'utente e visualizzare nuovamente il modulo.


0

Infine, il filtro visualizzato nella finestra Sfoglia è impostato dal browser. Puoi specificare tutti i filtri che desideri nell'attributo Accetta, ma non hai alcuna garanzia che il browser dell'utente vi aderisca.

La soluzione migliore è fare una sorta di filtro nel back-end del server.


0

Controlla un progetto chiamato Uploadify. http://www.uploadify.com/

È un uploader di file basato su Flash + jQuery. Questo utilizza la finestra di dialogo di selezione dei file di Flash, che ti dà la possibilità di filtrare i tipi di file, selezionare più file contemporaneamente, ecc.


30
Flash? ... assolutamente no!
ErickBest

14
La peggiore soluzione di sempre.
Matteo Mosconi

1
Ragazzi, non vedo perché sia ​​la peggiore soluzione in assoluto. Anche se è vero che Flash sta per scomparire, è ancora utilizzato dai vecchi browser - molto vecchi, ok, ma viene ancora utilizzato - e questa soluzione ha entrambi i tipi di tecnologie: jQuery + HTML5 e Flash fallback. È buono come VideoJS, che ha un fallback Flash nel caso in cui il browser non possa riprodurre il video ... Non ho testato la soluzione, può non essere la migliore, ma i voti negativi non sono giusti.
Unapedra

1
+1 Stupido votare contro. Flash sta andando via ma ha un buon fallback. Cosa pensi che utilizzi Google per Gmail per il fallback dei socket? Silly.
Jason Sebring

8
Questa risposta ha 4 anni. A quel tempo, il supporto HTML5 per la selezione di più file o il filtraggio della finestra di selezione del file in base ai tipi accettati non era ben supportato in nessuno dei principali browser. Questa era una soluzione che avrebbe funzionato per molti all'epoca, ma ora mi sposterei verso una soluzione HTML5 pura.
AndrewR
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.