Descompactar arquivos com PHP
Ola pessoal tudo bom?
Hoje vou postar mais uma dica: Como descompactar um arquivo ZIP com PHP.
Desenvolvi um sistema no qual os usuários trabalham com arquivos de texto muito grandes(acima de 20mb), ai neste caso, eles sempre ficam com os arquivos zipados na máquina… facilitando no caso de mandar para algum e-mail e etc…
Pensando nisso eu fiz com que eles pudessem fazer o upload dos arquivos zipados para o sistema e em uma tela eu exibia uma prévia(os nomes) do(s) arquivo(s) que estão dentro do ZIP.
Neste servidor eu instalei a versão 5.2.8 do PHP com todas as extenções, logo, não precisei configurar nada para funcionar.
Vamor para o código:
-
<?
-
/**
-
* Esta função retorna um array com
-
* os nomes dos arquivos que estão
-
* dentro do zip.
-
*
-
* @param String $path: Local do arquivo .zip
-
* @return array ou false no caso de erro
-
*/
-
function zipToArray($path){
-
# ===— Instancia a classe
-
$zip = new ZipArchive;
-
# ====– Tenta abrir o zip
-
if($zip->open($path)){
-
# ===— Recupera o numero de arquivos do zip
-
$num_files = $zip->numFiles;
-
# ===— percorre os arquivos pegando os nomes e colocando em um array
-
for($i=0; $i<=($num_files)-1;$i++){
-
$saida[] = $zip->getNameIndex($i);
-
}
-
# ====— fecha a conexão
-
$zip->close();
-
# ====— Retora o array para ser manipulado
-
return $saida;
-
}
-
return false;
-
}
-
?>
A função acima abre o ZIP e retorna um array com o conteúdo do arquivo. Útil pois não necessáriamente eu quero mostrar os arquivos na tela, mas posso utilizar para fazer qualquer outra coisa… desta forma eu apenas manipulo o array que foi retornado.
Para descompactar o arquivo ZIP eu utilizei esta função:
-
<?
-
/**
-
* Esta função descompacta arquivos
-
* de um zip
-
*
-
* @param String $path: Local do arquivo .zip
-
* @param String $pathunzip: Pasta onde os arquivos devem ser descompactados
-
*/
-
function unZip($path, $pathunzip=‘.’){
-
# ===— Instancia a classe do Zip
-
$zip = new ZipArchive;
-
# ===— Tenta abrir o zip
-
if($zip->open($path)){
-
$return = $zip->extractTo($pathunzip); // executa o unzip
-
$zip->close(); // fecha a coneção com o .zip
-
} else {
-
echo ‘O arquivo não pode ser aberto.’;
-
}
-
}
-
?>
Como vocês podem ver, é tudo muito simples. Eu na verdade fiz uma classe para poder manipular os arquivos… Você pode utilizar estas funções de qualquer maneira ok? Para testar podemos rodar o seguinte script:
-
<?
-
/**
-
* Esta função retorna um array com
-
* os nomes dos arquivos que estão
-
* dentro do zip.
-
*
-
* @param String $path: Local do arquivo .zip
-
* @return array ou false no caso de erro
-
*/
-
function zipToArray($path){
-
# ===— Instancia a classe
-
$zip = new ZipArchive;
-
# ====– Tenta abrir o zip
-
if($zip->open($path)){
-
# ===— Recupera o numero de arquivos do zip
-
$num_files = $zip->numFiles;
-
# ===— percorre os arquivos pegando os nomes e colocando em um array
-
for($i=0; $i<=($num_files)-1;$i++){
-
$saida[] = $zip->getNameIndex($i);
-
}
-
# ====— fecha a conexão
-
$zip->close();
-
# ====— Retora o array para ser manipulado
-
return $saida;
-
}
-
return false;
-
}
-
-
/**
-
* Esta função descompacta arquivos
-
* de um zip
-
*
-
* @param String $path: Local do arquivo .zip
-
* @param String $pathunzip: Pasta onde os arquivos devem ser descompactados
-
*/
-
function unZip($path, $pathunzip=‘.’){
-
# ===— Instancia a classe do Zip
-
$zip = new ZipArchive;
-
# ===— Tenta abrir o zip
-
if($zip->open($path)){
-
$return = $zip->extractTo($pathunzip); // executa o unzip
-
$zip->close(); // fecha a coneção com o .zip
-
} else {
-
echo ‘O arquivo não pode ser aberto.’;
-
}
-
}
-
unZip(‘zip.zip’); // extrai o conteudo
-
?>
Claro que você pode utilizar uma biblioteca que faz muito mais coisas com seus arquivos zipados, mas dependendo do tamanho da sua aplicação na minha opinião não compensa usar uma lib gigante e chata de aprender apenas para ler e descompactar arquivos… mas isso fica a critério de cada um. Acho importante ao menos aprender como fazer.
para mais informações: http://br2.php.net/zip
Espero ter ajudado!


(13 votos, média: 4.77 de 5)
12 Comentários to “Descompactar arquivos com PHP”
Marcelo, excelente esse seu post. Acesso seu blog todas as semana para ver as novidades. Valeu!!!
Por Bruno Roberto Gomes (2 comments) em 29/03/2009
Olá, legal! era exatamente isso que estava precisando, pra descompactar arquivos no servidor!
Por Cleyton (1 comments) em 20/11/2009
Que ótimo Cleyton!!!
fico feliz em ter ajudado hehehehe
abraços
Por Marcelo Sabadini (109 comments) em 23/11/2009
Cara, parabéns, salvou o dia, ótimo post!
Por Eduardo (3 comments) em 01/12/2009
@Eduardo: Fico muito feliz!
Pretendo voltar a postar mais, o problema sempre é o tempo!
um grande abraço!
Por Marcelo Sabadini (109 comments) em 01/12/2009
Boa tarde Marcelo, simples e objetivo o seu post! Se não for pedir muito, seria possível você postar além de Descompactar, como também adicionar os arquivos que estão no .ZIP no Banco de Dados? abraços
Por Vinicius Oliveira (1 comments) em 01/02/2010
@Vinicius Oliveira: fala kra tudo bom?
mostrar como que coloca os arquivo no banco de dados foge um pouco do foco do post, pois isto pode ser feito de diversas formas.
Mas de uma olhada no link abaixo, acho que vai conseguir fazer tranquilamente ok?
http://marcelosabadini.com.br/blog/2008/10/30/mini-curso-de-php-parte-11-iv-insert-e-select-%E2%80%93-mysql-no-php/
Um grande abraço!
Por Marcelo Sabadini (109 comments) em 02/02/2010
Não funcionou comigo, esta apresentando os seguintes erros quando eu executo o script:
Warning: ZipArchive::close() [function.ZipArchive-close]: Invalid or unitialized Zip object in C:\… on line 28
nessa linha esta o comando $zip->close();
Warning: ZipArchive::extractTo() [function.ZipArchive-extractTo]: Invalid or unitialized Zip object in C:\… on line 52
nessa linha esta o comando $return = $zip->extractTo($pathunzip); // executa o unzip
Warning: ZipArchive::close() [function.ZipArchive-close]: Invalid or unitialized Zip object in C:\.. on line 53
nessa linha esta o comando $zip->close(); // fecha a coneção com o .zip
O que pode estar acontecendo?
Por Diogo (1 comments) em 31/05/2010
Kara, vlw mesmo. tava procurando um script assim. agora fiz uma adm completa.
Grato mesmo
Por James Bond (1 comments) em 21/10/2010
Excelente sua funcao, tudo que procurava, parabéns e sucessos amigo
Por Deivid R. Nogueira (1 comments) em 09/11/2010
É possível usar esta classe com arquivos zipados com senha?
Onde eu colocaria a senha no script?
Por Anderson (2 comments) em 22/12/2010