Como ter o jQuery restringir os tipos de arquivo no upload?


133

Gostaria que o jQuery limite um campo de upload de arquivo para apenas jpg / jpeg, png e gif. Já estou fazendo verificação de back-end PHP. Já estou executando meu botão de envio por meio de uma JavaScriptfunção, então só preciso saber como verificar os tipos de arquivo antes de enviar ou alertar.

Respostas:


280

Você pode obter o valor de um campo de arquivo da mesma forma que qualquer outro campo. Você não pode alterá-lo, no entanto.

Portanto, para verificar superficialmente se um arquivo tem a extensão correta, você pode fazer algo assim:

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

18
E vincule-o ao seu formulário: $("#my_upload_form").bind("submit", function() { // above check });
— 321X 23/06

7
você poderia usar$('#file_field').change(function(){// above check});
— makki

3
$("#my_upload_form").bind("submit", function() { // above check });agora deve ser vinculado usando $("#my_upload_form").submit(function() { // above check }); api.jquery.com/submit . você também pode impedir que o formulário submeter usando$("#my_upload_form").submit(function(e) { // above check e.preventDefault(); });
— Liam

1
Nesse caso, se o usuário adicionasse, ".jpg" por exemplo, ao arquivo do MS Word, o FileUpload aceitaria esse arquivo como imagem. Eu acho que não está certo.
— Jeyhun

3
Vale a pena afirmar que este não é um método à prova de idiotas. No final do dia, verifique se o seu back-end está verificando os primeiros bytes do arquivo para garantir que ele seja realmente o tipo de arquivo que você realmente deseja. Outra coisa a se pensar é, em Linux e OSX você pode ter um arquivo sem uma extensão isso é, na verdade, do tipo que você quiser .. assim que este seria um fracasso nessa também
— chris

39

Nenhum plug-in é necessário apenas para esta tarefa. Cobbled isso juntos de alguns outros 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 = '';
    }
});

O truque aqui é definir o botão de upload como desativado, a menos e até que um tipo de arquivo válido seja selecionado.


6
desculpe mano, mas isso é um regex ruim. arquivos podem ter pontos em seu nome. "giel.asd.aaaaa.jpg.png" .match (/\.(.+)$/)
— Tim Kretschmer

27

Você pode usar o plug-in de validação para jQuery: http://docs.jquery.com/Plugins/Validation

Acontece que existe uma regra accept () que faz exatamente o que você precisa: http://docs.jquery.com/Plugins/Validation/Methods/accept#extension

Observe que o controle da extensão do arquivo não é à prova de balas, pois não está relacionado ao tipo de mimet do arquivo. Assim, você pode ter um .png que é um documento do word e um .doc que é uma imagem png perfeitamente válida. Portanto, não se esqueça de fazer mais controles do lado do servidor;)


você pode fornecer exemplo de como usar isso com plugins.krajee.com/file-input#option-allowedfileextensions no IE11
— shorif2000

25

Para o front-end, é bastante conveniente colocar ' accept o atributo ' ' se você estiver usando um campo de arquivo.

Exemplo:

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

Algumas notas importantes:


1
Muito melhor do que usando JQuery
— Christopher Grigg

19

Não deseja verificar mais o MIME do que qualquer extensão que o usuário esteja mentindo? Nesse caso, é menos de uma linha:

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

não consegue o que ele precisa. é apenas para facilitar o manuseio para selecionar uma imagem de uma pasta com extensão diferente. como você pode ver aqui -> imageshack.us/a/img20/8451/switchzz.jpg
— bernte

Como não prejudica o IE <10 e não prejudica outro código, é uma restrição efetiva ao que você está tentando restringir.
— Leo

4

para o meu caso, usei os seguintes códigos:

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

3

Eu tento escrever um exemplo de código de trabalho, testo e tudo funciona.

Hare é 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

Esse código funciona bem, mas o único problema é que, se o formato do arquivo for diferente das opções especificadas, ele exibirá uma mensagem de alerta, mas exibirá o nome do arquivo enquanto o deveria negligenciar.

$('#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 exemplo permite carregar apenas imagem 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;
                    }
                });

Você poderia sugerir como restringir o tamanho da imagem. Por exemplo, uma imagem de tamanho 10mb não deve ser aceita
— PDSSandeep

@PDSSandeep Verifique este link pls stackoverflow.com/questions/6575159/…
— Desenvolvedor

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>

Não é possível verificar o tipo e tamanho do arquivo, testado no FF.
— Qammar Feroz 11/11

0

Se você está lidando com vários uploads de arquivos (html 5), peguei o comentário sugerido principal e modifiquei-o um pouco:

    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

Aqui está um código simples para validação de javascript e, após a validação, ele limpará o arquivo 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("");
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.