¿Cómo hacer que jQuery restrinja los tipos de archivos en la carga?

133

Me gustaría que jQuery limite un campo de carga de archivos a solo jpg / jpeg, png y gif. Ya estoy haciendo una comprobación de backend PHP. Ya estoy ejecutando mi botón de envío a través de una JavaScriptfunción, así que realmente solo necesito saber cómo verificar los tipos de archivo antes de enviar o alertar.

Antonio
fuente

Respuestas:

280

Puede obtener el valor de un campo de archivo igual que cualquier otro campo. Sin embargo, no puedes alterarlo.

Entonces, para verificar superficialmente si un archivo tiene la extensión correcta, puede hacer algo como esto:

var ext = $('#my_file_field').val().split('.').pop().toLowerCase();
if($.inArray(ext, ['gif','png','jpg','jpeg']) == -1) {
    alert('invalid extension!');
}
Paolo Bergantino
fuente
18
Y $("#my_upload_form").bind("submit", function() { // above check });
vincúlelo
77
podrías usar$('#file_field').change(function(){// above check});
makki
3
$("#my_upload_form").bind("submit", function() { // above check });ahora debe vincularse usando $("#my_upload_form").submit(function() { // above check }); api.jquery.com/submit . también puede evitar que se envíe el formulario usando$("#my_upload_form").submit(function(e) { // above check e.preventDefault(); });
Liam
1
En este caso, si el usuario agregara, ".jpg" por ejemplo, un archivo de MS Word, FileUpload aceptaría este archivo como imagen. Creo que no está bien.
Jeyhun
3
Vale la pena declarar que este no es un método infalible. Al final del día, asegúrese de que su backend verifique los primeros bytes del archivo para asegurarse de que sea el tipo de archivo que realmente desea que sea. Otra cosa a tener en cuenta es que, en Linux y OSX, puede tener un archivo sin una extensión que sea realmente del tipo que desea ... así que esto también fallaría
Chris
39

No es necesario un complemento solo para esta tarea. Cobbleed esto de un par de otros scripts:

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

El truco aquí es configurar el botón de carga en deshabilitado a menos que se seleccione un tipo de archivo válido.

cristiano
fuente
66
lo siento hermano, pero esa es una mala expresión regular. los archivos pueden tener puntos en su nombre. "giel.asd.aaaaa.jpg.png" .match (/\.(.+)$/)
Tim Kretschmer
27

Puede usar el complemento de validación para jQuery: http://docs.jquery.com/Plugins/Validation

Resulta que tiene una regla accept () que hace exactamente lo que necesita: http://docs.jquery.com/Plugins/Validation/Methods/accept#extension

Tenga en cuenta que controlar la extensión del archivo no es a prueba de balas, ya que no está relacionado de ninguna manera con el tipo MIME del archivo. Entonces podría tener un .png que es un documento de Word y un .doc que es una imagen png perfectamente válida. Así que no olvide hacer más controles del lado del servidor;)

Julian Aubourg
fuente
¿Puede dar un ejemplo de cómo usar esto con plugins.krajee.com/file-input#option-allowedfileextensions en IE11
shorif2000
25

Para el front-end, es bastante conveniente poner el atributo ' accept ' si está utilizando un campo de archivo.

Ejemplo:

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

Un par de notas importantes:

dhruvpatel
fuente
1
Mucho mejor que usar JQuery
Christopher Grigg
19

¿No quieres comprobar más en MIME que en cualquier medida en que mienta el usuario? Si es así, es menos de una línea:

<input type="file" id="userfile" accept="image/*|video/*" required />
León
fuente
no consigue lo que necesita es solo para un manejo más fácil al seleccionar una imagen de una carpeta con diferente extensión. como puedes ver aquí -> imageshack.us/a/img20/8451/switchzz.jpg
bernte
Como no perjudica a IE <10 y no perjudica a otro código, es una restricción efectiva sobre lo que está tratando de restringir.
Leo
4

para mi caso usé los siguientes códigos:

    if (!(/\.(gif|jpg|jpeg|tiff|png)$/i).test(fileName)) {              
    alert('You must select an image file only');               
    }
vanessen
fuente
3

Intento escribir un ejemplo de código de trabajo, lo pruebo y todo funciona.

Liebre es código:

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
    }
}
Avtandil Kavrelishvili
fuente
1

Este código funciona bien, pero el único problema es que si el formato del archivo es diferente a las opciones especificadas, muestra un mensaje de alerta pero muestra el nombre del archivo mientras debería descuidarlo.

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

Este ejemplo permite cargar solo imágenes 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;
                    }
                });
Desarrollador
fuente
¿Podría sugerir cómo restringir el tamaño de la imagen? Por ejemplo, una imagen de tamaño 10mb no debería aceptar
PDSSandeep
@PDSSandeep Consulte este enlace pls stackoverflow.com/questions/6575159/…
Desarrollador el
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>
Khaihkd
fuente
Esto no puede verificar el tipo y tamaño de archivo, probado en FF.
Qammar Feroz
0

Si está tratando con múltiples cargas de archivos (html 5), tomé el comentario sugerido y lo modifiqué un poco:

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

        }
    }
Jason Roner
fuente
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 = '';
La academia EasyLearn
fuente
-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;
    }
Muhammad Saqib Sarwar
fuente
-1

Aquí hay un código simple para la validación de JavaScript, y después de que valide, limpiará el archivo de entrada.

<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("");
    }
}
matheushf
fuente