Pergunta

Eu gostaria de ter limite jQuery um campo de upload de arquivo somente jpg / jpeg, png, e gif. Estou fazendo backend verificar com PHP já. Estou executando o meu botão enviar através de uma função JavaScript já então eu realmente só precisa saber como verificar os tipos de arquivos antes de enviar ou alerta.

Foi útil?

Solução

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

Assim, para superficialmente Verificar se um arquivo tenha a extensão direita, você poderia fazer algo parecido com isto:

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

Outras dicas

nenhum plugin necessário para apenas esta tarefa. Pavimentada este conjunto de um par de 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 é para definir o botão de upload para pessoas com deficiência, a menos e até que um tipo de arquivo válido é selecionado.

Você pode usar a validação do plugin para jQuery: http://docs.jquery.com/Plugins/Validation

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

Note que o controle da extensão do arquivo não é à prova de bala, uma vez que não é de forma alguma relacionado com o tipo MIME do arquivo. Então, você poderia ter um .png que é um documento do Word e um arquivo .doc que é uma imagem png perfeitamente válida. Portanto, não se esqueça de fazer server-side mais controles;)

Para o front-end é bastante conveniente para colocar ' aceitar ' 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" 
/>

Um par de notas importantes:

Do not querer verificar em vez de MIME do que em qualquer extensão o usuário está mentindo? Se assim for, então é menos de uma linha:

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

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

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

Eu tento escrever trabalhando exemplo de código, eu testá-lo e tudo funciona.

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

Este código funciona bem, mas o único problema é se o formato de arquivo é diferente de opções especificadas, ele mostra uma mensagem de alerta, mas ele exibe o nome do arquivo ao mesmo tempo que deve ser negligenciá-lo.

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

Este exemplo permite fazer upload de imagem PNG somente.

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

Se você está lidando com múltiplos (html 5) o upload de arquivos, eu levei o comentário top sugerido e modifiquei 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!');

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

Aqui está um código simples para validação javascript, e depois de ele valida ele irá 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("");
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top