quinta-feira, 16 de outubro de 2014

[Python] - Testando se um arquivo é arquivo ZIP - zipfile

Olá pessoal, nesse post nós iremos utilizar a linguagem de programação Python para testar se um arquivo é um arquivo ZIP.

Para isso nós iremos utilizar o módulo "zipfile". Esse módulo é nativo (já vem com o interpretador), o código que iremos disponibilizar foi testado nas versões do Python 2.7 e 3.2.

O que são arquivos ZIP? São arquivos compactados, vários programas trabalham com arquivos ZIP (exemplo: WinZip, 7z etc.).

Em que isso pode lhe ajudar? Vamos supor que você tem uma aplicação web que permite o upload de arquivos ZIP, mas você NÃO quer aceitar qualquer tipo de arquivo, mas sim somente arquivos ZIP, então você pode verificar se realmente o usuário enviou um arquivo ZIP utilizando o módulo "zipfile", é isso que iremos fazer.

Você pode está se perguntando: "o usuário pode burlar isso facilmente inserindo a extensão .zip ao final do nome do arquivo". Exemplo: tenho um arquivo "teste.exe" e altero para "teste.exe.zip", será que ele conseguirá burlar o teste? A resposta é não, pois o módulo possui uma função chamada "testzip" que irá verificar o CRC e cabeçalho do arquivo, ou seja, verifica se realmente se trata de um arquivo ZIP, por isso é seguro utilizar o módulo "zipfile".


Linha 3: importação do módulo "zipfile".

Linha 5: definição da função "validate_zip" para que possamos usar em qualquer parte do arquivo ou em outros arquivos. Essa função recebe um "file_path" que é o caminho do arquivo.

Linha 7: cláusula try que tenta fazer algo. É colocado dentro de um try porque pode ser que seja passado um caminho inexistente. A classe ZipFile ler e escreve arquivos ZIP.

Linha 9: a função "testzip" testa se NÃO é um arquivo ZIP, ou seja, se é um "bad file". Por isso retorna True (verdadeiro) se não for um "bad file". Senão retorna False (falso) na linha 11.

Se ocorrer alguma exceção então a função retorna False (linha 13).

Linha 15: chamada da função "validate_zip" para testar. Como coloquei o arquivo no mesmo diretório do arquivo de código python, então não precisei passar o caminho completo do arquivo, mas sim somente o nome.

Documentação do módulo "zipfile":


Quaisquer dúvidas deixem nos comentários, até a próxima.


Nenhum comentário: