2009-03-16 11 views
122

Mi piacerebbe che jQuery limiti un campo di caricamento file solo a jpg/jpeg, png e gif. Sto già facendo il backend di controllo con PHP. Sto facendo funzionare il mio pulsante di invio tramite una funzione JavaScript quindi ho davvero bisogno di sapere come verificare i tipi di file prima di inviare o avvisare.Come limitare i tipi di file jQuery al caricamento?

risposta

254

È possibile ottenere il valore di un campo di file proprio come qualsiasi altro campo. Non puoi modificarlo, comunque.

Quindi, per superficialmente controllare se un file ha l'estensione a destra, si potrebbe fare qualcosa di simile:

var ext = $('#my_file_field').val().split('.').pop().toLowerCase(); 
if($.inArray(ext, ['gif','png','jpg','jpeg']) == -1) { 
    alert('invalid extension!'); 
} 
+18

e associarlo al form:. '$ ("# my_upload_form") si legano ("submit", function() { // sopra il controllo }); ' – 321X

+7

si potrebbe usare' $ ('# file_field'). Change (function() {// above check}); ' – makki

+3

' $ ("# my_upload_form"). Bind ("submit", function() {// above check}); 'ora dovrebbe essere associato usando' $ ("# my_upload_form"). Submit (function() {//above check}); 'http://api.jquery.com/submit/. puoi anche impedire che il modulo invii usando '$ (" # my_upload_form "). submit (function (e) {// above check e.preventDefault();});' – Liam

26

è possibile utilizzare il plugin di convalida per jQuery: http://docs.jquery.com/Plugins/Validation

Succede a avere una regola accept() che fa esattamente ciò che ti serve: http://docs.jquery.com/Plugins/Validation/Methods/accept#extension

Nota che il file di controllo si estende Sion non è a prova di proiettile poiché non è in alcun modo correlato al mimetype del file. Quindi potresti avere un file .png che è un documento word e un .doc che è un'immagine png perfettamente valida. Quindi non dimenticare di effettuare più controlli sul lato server;)

+0

puoi fornire esempi su come utilizzare questo con http://plugins.krajee.com/file-input#option-allowedfileextensions su IE11 – shorif2000

35

Nessun plug-in necessario per questa attività. Acciottolato questo insieme da un paio di altri script:

$('INPUT[type="file"]').change(function() { 
    var ext = this.value.match(/\.(.+)$/)[1]; 
    switch (ext) { 
     case 'jpg': 
     case 'jpeg': 
     case 'png': 
     case 'gif': 
      $('#uploadButton').attr('disabled', false); 
      break; 
     default: 
      alert('This is not an allowed file type.'); 
      this.value = ''; 
    } 
}); 

Il trucco è quello di impostare il pulsante Carica per portatori di handicap a meno che e fino a selezionare un tipo di file valido.

+5

sorry bro, ma si tratta di una espressione regolare negativa. i file possono avere punti nel suo nome. "giel.asd.aaaaa.jpg.png" .match (/.(.+)$/) –

19

Non si desidera controllare piuttosto su MIME che su qualsiasi estensione l'utente stia mentendo? Se è così allora è meno di una riga:

<input type="file" id="userfile" accept="image/*|video/*" required /> 
+5

Bello ma non accettato da IE <10. – spadelives

+0

non ottiene ciò di cui ha bisogno. è solo per facilitare la gestione di selezionare un'immagine da una cartella con estensione diversa. come puoi vedere qui -> http://imageshack.us/a/img20/8451/switchzz.jpg – bernte

+0

Poiché non fa male a IE <10 e non fa male al codice, è una restrizione efficace su ciò che stai cercando di restringere. – Leo

4

per il mio caso ho usato i seguenti codici:

if (!(/\.(gif|jpg|jpeg|tiff|png)$/i).test(fileName)) {    
    alert('You must select an image file only');    
    } 
-1
function validateFileExtensions(){ 
     var validFileExtensions = ["jpg", "jpeg", "gif", "png"]; 
     var fileErrors = new Array(); 

     $("input:file").each(function(){ 
      var file = $(this).value; 
      var ext = file.split('.').pop(); 
      if($.inArray(ext, validFileExtensions) == -1) { 
       fileErrors.push(file); 
      } 
     }); 

     if(fileErrors.length > 0){ 
      var errorContainer = $("#validation-errors"); 
      for(var i=0; i < fileErrors.length; i++){ 
       errorContainer.append('<label for="title" class="error">* File:'+ file +' do not have a valid format!</label>'); 
      } 
      return false; 
     } 
     return true; 
    } 
0
<form enctype="multipart/form-data"> 
    <input name="file" type="file" /> 
    <input type="submit" value="Upload" /> 
</form> 
<script> 
$('input[type=file]').change(function(){ 
    var file = this.files[0]; 
    name = file.name; 
    size = file.size; 
    type = file.type; 
    //your validation 
}); 
</script> 
+0

Questo non può controllare il tipo e la dimensione del file, testato in FF. –

0

Se hai a che fare con più (HTML 5) caricamento di file, ho preso il commento suggerito in alto e modificato leggermente:

var files = $('#file1')[0].files; 
    var len = $('#file1').get(0).files.length; 

    for (var i = 0; i < len; i++) { 

     f = files[i]; 

     var ext = f.name.split('.').pop().toLowerCase(); 
     if ($.inArray(ext, ['gif', 'png', 'jpg', 'jpeg']) == -1) { 
      alert('invalid extension!'); 

     } 
    } 
18

Per il front-end è piuttosto comodo attribuire l'attributo 'accept' se si utilizza un campo file.

Esempio:

<input id="file" type="file" name="file" size="30" 
     accept="image/jpg,image/png,image/jpeg,image/gif" 
/> 

Un paio di note importanti:

+1

Molto meglio dell'utilizzo di JQuery –

2

provo a scrivere lavorare esempio di codice, i test e tutto funziona .

Hare è il codice:

HTML:

<input type="file" class="attachment_input" name="file" onchange="checkFileSize(this, @Model.MaxSize.ToString(),@Html.Raw(Json.Encode(Model.FileExtensionsList)))" /> 

Javascript:

//function for check attachment size and extention match 
function checkFileSize(element, maxSize, extentionsArray) { 
    var val = $(element).val(); //get file value 

    var ext = val.substring(val.lastIndexOf('.') + 1).toLowerCase(); // get file extention 
    if ($.inArray(ext, extentionsArray) == -1) { 
     alert('false extension!'); 
    } 

    var fileSize = ($(element)[0].files[0].size/1024/1024); //size in MB 
    if (fileSize > maxSize) { 
     alert("Large file");// if Maxsize from Model > real file size alert this 
    } 
} 
-1

Ecco un semplice codice JavaScript convalida, e dopo che lo convalida pulirà il file di input.

<input type="file" id="image" accept="image/*" onChange="validate(this.value)"/> 

function validate(file) { 
    var ext = file.split("."); 
    ext = ext[ext.length-1].toLowerCase();  
    var arrayExtensions = ["jpg" , "jpeg", "png", "bmp", "gif"]; 

    if (arrayExtensions.lastIndexOf(ext) == -1) { 
     alert("Wrong extension type."); 
     $("#image").val(""); 
    } 
} 
1

Questo codice funziona bene, ma l'unico problema è che se il formato del file è diverso da opzioni specificate, mostra un messaggio di avviso, ma viene visualizzato il nome del file, mentre dovrebbe essere trascurato esso.

$('#ff2').change(
       function() { 
        var fileExtension = ['jpeg', 'jpg', 'pdf']; 
        if ($.inArray($(this).val().split('.').pop().toLowerCase(), fileExtension) == -1) { 
         alert("Only '.jpeg','.jpg','.pdf' formats are allowed."); 
         return false; } 
}); 
1

Questo esempio consente di caricare solo immagini PNG.

HTML

<input type="file" class="form-control" id="FileUpload1" accept="image/png" /> 

JS

$('#FileUpload1').change(
       function() { 
        var fileExtension = ['png']; 
        if ($.inArray($(this).val().split('.').pop().toLowerCase(), fileExtension) == -1) { 
         alert("Only '.png' format is allowed."); 
         this.value = ''; // Clean field 
         return false; 
        } 
       }); 
Problemi correlati