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.