Come fare in modo che jQuery limiti i tipi di file al caricamento?


133

Vorrei che jQuery limitasse un campo di caricamento di file a solo jpg / jpeg, png e gif. Sto PHPgià controllando il backend . Sto già eseguendo il mio pulsante di invio tramite una JavaScriptfunzione, quindi devo solo sapere come verificare i tipi di file prima di inviare o avvisare.

Risposte:


280

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

Quindi per verificare superficialmente se un file ha l'estensione giusta, puoi fare qualcosa del genere:

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

18
E $("#my_upload_form").bind("submit", function() { // above check });
legalo

7
potresti usare$('#file_field').change(function(){// above check});
Makki il

3
$("#my_upload_form").bind("submit", function() { // above check });ora dovrebbe essere associato utilizzando $("#my_upload_form").submit(function() { // above check }); api.jquery.com/submit . puoi anche impedire l'invio del modulo utilizzando$("#my_upload_form").submit(function(e) { // above check e.preventDefault(); });
Liam

1
In questo caso, se l'utente aggiungesse ".jpg" ad esempio al file MS Word, FileUpload accetterebbe questo file come immagine. Penso che non sia giusto.
Jeyhun,

3
Vale la pena affermare che questo non è un metodo infallibile .. Alla fine della giornata assicurati che il tuo backend stia controllando i primi byte del file per assicurarti che sia il tipo di file che vuoi davvero. Un'altra cosa a cui pensare è che in Linux e OSX puoi avere un file senza estensione che in realtà è del tipo che vuoi .. quindi questo fallirebbe anche su quello
chris

39

Nessun plugin necessario solo per questa attività. Combinato 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 qui è impostare il pulsante di caricamento su disabilitato a meno che e fino a quando non viene selezionato un tipo di file valido.


6
scusa fratello, ma questa è una cattiva regex. i file possono avere punti nel suo nome. "giel.asd.aaaaa.jpg.png" .match (/\.(.+)$/)
Tim Kretschmer,

27

È possibile utilizzare il plug-in di convalida per jQuery: http://docs.jquery.com/Plugins/Validation

Capita di avere una regola accept () che fa esattamente quello che ti serve: http://docs.jquery.com/Plugins/Validation/Methods/accept#extension

Si noti che il controllo dell'estensione del file non è a prova di proiettile poiché non è in alcun modo correlato al mimetype del file. Quindi potresti avere un .png che è un documento word e un .doc che è un'immagine png perfettamente valida. Quindi non dimenticare di rendere più controlli lato server;)


puoi fornire un esempio su come utilizzarlo con plugins.krajee.com/file-input#option-allowedfileextensions su IE11
shorif2000,

25

Per il front-end è abbastanza conveniente inserire l'attributo ' accetta ' 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'uso di JQuery
Christopher Grigg,

19

Non vuoi controllare piuttosto il MIME piuttosto che l'estensione che l'utente sta mentendo? In tal caso, è inferiore a una riga:

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

non ottiene ciò di cui ha bisogno. è solo per una gestione più semplice selezionare un'immagine da una cartella con estensione diversa. come si può vedere qui -> imageshack.us/a/img20/8451/switchzz.jpg
bernte

Poiché non danneggia IE <10 e non danneggia altri codici, è un'efficace restrizione a ciò che stai cercando di limitare.
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');               
    }

3

Provo a scrivere un esempio di codice funzionante, lo collaudo e tutto funziona.

La lepre è 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

Questo codice funziona bene, ma l'unico problema è se il formato del file è diverso dalle opzioni specificate, mostra un messaggio di avviso ma mostra il nome del file mentre dovrebbe trascurarlo.

$('#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;
                    }
                });

Potresti suggerire come limitare le dimensioni dell'immagine. Ad esempio, l'immagine in formato 10 MB non dovrebbe accettare
PDSSandeep

@PDSSandeep controllare questo link pls stackoverflow.com/questions/6575159/...
Developer

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>

Questo non può controllare il tipo e le dimensioni del file, testato in FF.
Qammar Feroz,

0

Se hai a che fare con più caricamenti di file (html 5), ho preso il commento più consigliato e l'ho modificato un po ':

    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!');

        }
    }

0
    $("input[name='btnsubmit']").attr('disabled', true);
    $('input[name="filphoto"]').change(function () {
    var ext = this.value.match(/\.(.+)$/)[1];
    switch (ext) 
    {
    case 'jpg':
    case 'jpeg':
    case 'png':
    case 'bmp':
        $("input[name='btnsubmit']").attr('disabled', false);
    break;
    default:
        alert('This is not an allowed file type.');
        $("input[name='btnsubmit']").attr('disabled', true);
        this.value = '';

-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;
    }

-1

Ecco un semplice codice per la convalida javascript e dopo la 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("");
    }
}
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.