Upload de arquivos com validação em javascript

Aprenda a validar a extensão e o tamanho do arquivo antes de fazer upload com JS

Este é um exemplo de validação de formulário de upload de imagens, utilizando o JavaScript. Neste exemplo, vamos restringir o envio de uma imagem a determinadas extensões. Caso a imagem esteja correta, vamos fazer um preview da imagem, para que o usuário tenha certeza que está enviando a imagem correta. Vamos aproveitar e validar também o tamanho do arquivo.

Mas antes, alguns detalhes referentes ao upload de arquivos.

Quando você criar o seu formulário no HTML, a tag "FORM" deverá receber o atributo enctype="multipart/form-data". O metódo de envio deve ser POST. O campo que vai permitir que o usuário escolha a imagem deve ser um campo input do tipo "file"

No passado não era possível validar o tamanho do arquivo, mas com a constante evolução do JavaScript hoje é possível fazer isso antes de enviar o arquivo para o servidor. Em nosso exemplo, vamos restringir o tamanho a 2 MBs

A primeira parte será validar o tipo da extensão. Para fazer isso, será necessário utilizar uma expressão regular.

var caminhoArquivo = "teste.JPG";

var extensoesPermitidas = /(.jpg|.jpeg|.png|.gif)$/i;

if(!extensoesPermitidas.exec(caminhoArquivo)){

    console.log('erro');

} else{

console.log('OK');

}

Em nossa expressão regular , estamos validando se a string que possui o nome do arquivo termina com .jpg, .jpeg, .png ou .gif. O "/i" no final significa que a validação é case insensitive, ou seja, não vai diferenciar maiúsculas de minúsculas.

A segunda parte é validar o tamanho do arquivo.

Quando você trabalha com um campo input do tipo file, você pode fazer o upload de mais de um arquivo. Portanto, o conteúdo dele é um array. Se você vai mandar apenas 1 arquivo, basta pegar a primeira posição do array. Exemplo:

var arquivoInput = document.getElementById('arquivo');

if (arquivoInput.files && arquivoInput.files[0]) {

console.log(arquivoInput.files[0].size);

} else {

console.log('Não foi selecionado um arquivo');

}

No exemplo acima, o elemento com o id "arquivo" é um campo input do tipo file. O tamanho do arquivo retornado pela função size é em bytes. O valor de 1 Mb é de 1024 kilobytes. Por sua vez, 1 kilobyte é igual a 1024 bytes. Considerando isso, o valor em bytes de 2 Mbs é de 2.097.152 bytes.

if (arquivoInput.files[0].size > 2097152) {

console.log('tamanho inválido');

} else {

console.log('tamanho válido');

}

A última parte é fazer o preview da imagem, isso é importante que que o usuário tenha certeza que selecionou o arquivo correto.

O JavaScript possui uma API chamada FileReader. Para utilizar, você precisa primeiro criar uma instância deste objeto.

var reader = new FileReader();

O FileReader possui um método chamado "readAsDataURL", que vai receber como parâmetro o arquivo selecionado pelo usuário. Quando este método for utilizado, a instância de "FileReader" vai executer o método "onload". Neste método, vamos selecionar uma DIV vazia de nosso formulário, e vamos criar um elemento IMG contendo a imagem selecionada

var reader = new FileReader();

reader.onload = function(e) {

    document.getElementById('visualizarImagem').innerHTML = '';

};

reader.readAsDataURL(arquivoInput.files[0]);

Segue abaixo o código completo:

function validarArquivo(){

    var arquivoInput = document.getElementById('arquivo');

    var caminhoArquivo = arquivoInput.value;

    var extensoesPermitidas = /(.jpg|.jpeg|.png|.gif)$/i;

    if(!extensoesPermitidas.exec(caminhoArquivo)){

        alert('Por favor envie um arquivo que tenha as extensões.jpeg/.jpg/.png/.gif .');

        arquivoInput.value = '';

        return false;

    }else{

        if (arquivoInput.files && arquivoInput.files[0]) {

            var reader = new FileReader();

            reader.onload = function(e) {

                document.getElementById('visualizarImagem').innerHTML = '';

            };

            reader.readAsDataURL(arquivoInput.files[0]);

console.log(arquivoInput.files[0].size / 1024 / 1024);

console.log(arquivoInput.files[0].size);

if (arquivoInput.files[0].size > 2097152) { 

                alert("Tamanho do arquivo deve ser 2 MB!");

                return false;

            }

        }

    }

}

 

 

Quer conferir mais dicas sobre JavaScript? Clique aqui e veja mais dicas!