Comment faire pour que jQuery restreint les types de fichiers lors du téléchargement?

j'aimerais que jQuery limite un champ de téléchargement de fichier à jpg/jpeg, png et gif seulement. Je fais déjà une vérification arrière avec PHP . J'exécute déjà mon bouton Soumettre à travers une fonction JavaScript donc j'ai vraiment besoin de savoir comment vérifier les types de fichiers avant de soumettre ou d'alerter.

126
demandé sur TooTone 2009-03-16 21:56:34

13 réponses

vous pouvez obtenir la valeur d'un champ de fichier comme n'importe quel autre champ. Vous ne pouvez pas le modifier, cependant.

donc à superficiellement vérifiez si un fichier a la bonne extension, vous pouvez faire quelque chose comme ceci:

var ext = $('#my_file_field').val().split('.').pop().toLowerCase();
if($.inArray(ext, ['gif','png','jpg','jpeg']) == -1) {
    alert('invalid extension!');
}
262
répondu Paolo Bergantino 2010-12-14 17:31:34

pas de plugin nécessaire pour cette tâche.

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

ici, l'astuce consiste à désactiver le bouton de téléchargement jusqu'à ce qu'un type de fichier valide soit sélectionné.

37
répondu Christian 2012-11-28 00:11:48

vous pouvez utiliser le plugin de validation pour jQuery: http://docs.jquery.com/Plugins/Validation

il se trouve qu'il y a une règle accept () qui fait exactement ce dont vous avez besoin: http://docs.jquery.com/Plugins/Validation/Methods/accept#extension

notez que le contrôle de l'extension du fichier n'est pas une preuve par balle car il n'est en aucune façon lié au type mimétique du fichier. Donc vous pourriez avoir un .png qui est un document word et un .c'est une image png parfaitement valide. Alors n'oubliez pas de faire plus de contrôles côté serveur ;)

26
répondu Julian Aubourg 2011-07-21 14:02:16

vous ne voulez pas vérifier plutôt sur MIME que sur quelle extension l'utilisateur ment? Si c'est le cas, il y a moins d'une ligne:

<input type="file" id="userfile" accept="image/*|video/*" required />
19
répondu Leo 2013-02-28 14:41:00

pour le front-end, il est assez commode de mettre l'attribut accepter ' si vous utilisez un champ de fichier.

exemple:

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

quelques notes importantes:

19
répondu dhruvpatel 2017-05-23 10:31:35

pour mon cas, j'ai utilisé les codes suivants :

    if (!(/\.(gif|jpg|jpeg|tiff|png)$/i).test(fileName)) {              
    alert('You must select an image file only');               
    }
4
répondu vanessen 2013-10-16 11:26:54

j'essaie d'écrire un exemple de code de travail, je le teste et tout fonctionne.

Hare est code:

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
    }
}
2
répondu Avtandil Kavrelishvili 2014-12-11 09:38:10

ce code fonctionne très bien, mais le seul problème est que si le format de fichier est autre que les options spécifiées, Il affiche un message d'alerte mais il affiche le nom du fichier alors qu'il devrait être négliger.

$('#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
répondu Abhi 2017-01-20 22:52:33

cet exemple permet de télécharger une image PNG seulement.

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;
                    }
                });
1
répondu Academy of Programmer 2017-01-20 23:01:35
<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
répondu Khaihkd 2014-02-28 02:40:02

si vous avez affaire à plusieurs téléchargements de fichiers (html 5), j'ai pris le commentaire suggéré en haut et je l'ai modifié un peu:

    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
répondu Jason Roner 2014-08-09 21:18:26
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
répondu M Saqib Sarwar 2013-12-26 12:07:13

voici un code simple pour la validation javascript, et après qu'il valide, il nettoiera le fichier d'entrée.

<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
répondu matheushf 2016-01-20 13:23:52