¿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.

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

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.


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


¿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:


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 />

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

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

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

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

¿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>

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

        }
    }

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

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("");
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.