Atualizado em 02 de Agosto de 2013

Descompactar Arquivo com PHP

Olá pessoal,

Como prometido no post anterior (Compactar Pastas e Arquivos com PHP) hoje vamos ver como descompactar arquivo com PHP. Para fazer esta função também vamos usar a classe ZipArchive que é nativa do PHP.

Vamos ver um script de exemplo:

<?php
$arquivo = getcwd().'/arquivo-teste.zip';
$destino = getcwd().'/';

$zip = new ZipArchive;
  $zip->open($arquivo);
   if($zip->extractTo($destino) == TRUE)
   {
    echo 'Arquivo descompactado com sucesso.';
   }
   else
   {
    echo 'O Arquivo não pode ser descompactado.';
   }
  $zip->close();
?>


Bem simples!!! Dúvidas??? Comentem!!!


Gostou da dica??? Continue por dentro das dicas de programação!!! Assine a newsletter.


Até a próxima pessoal.

Tags:  Comandos PHP | Funções | PHP

Comentários

Sua foto do perfil

DANILO JOSE DOS SANTOS

Boa tarde amigo! tem como descompactar aquivo .rar?

30 de Janeiro de 2015 - 14:07

Sua foto do perfil

Mauricio Programador

Olá Danilo,

Tem sim, mas para isso você terá que instalar um pacote que esta neste link http://pecl.php.net/package/rar, e depois usar o código abaixo:

-----------------------------
$rar_file = rar_open('NOME_ARQUIVO');

$entries = rar_list($rar_file);

foreach ($entries as $entry)
{
$entry->extract('/z_testando/');
}

rar_close($rar_file);

-----------------------------

O grande problema disso e que eu não conheço nenhum servidor de hospedagem que tenha este pacote instalado.

Por tanto se você não tiver como fazer esta instalação no seu servidor e bom rever a utilidade neste caso.

Espero ter ajudado.

02 de Fevereiro de 2015 - 11:50

Sua foto do perfil

Marcelo Torres

Muito bom... Simplicidade e praticidade.
Funcionou com perfeição!

07 de Fevereiro de 2014 - 15:49

Sua foto do perfil

Ricardo Alves

Olá Mauricio sue poste funcionou direitinho mas quando o descompacta os arquivos eles dão erros na acentuação. EX Antes: AVIÃO, Depois: AVIåO. Como resolver esse problema?

15 de Janeiro de 2014 - 00:42

Sua foto do perfil

Mauricio Programador

Olá Ricardo,

estas classes sempre dão problema com acentuação, o bom seria remover os acentos antes de fazer a descompactação.
Para remover os acentos veja este post Remover Acentos com PHP.

Espero ter ajudado.

Abraço.

15 de Janeiro de 2014 - 09:48

Sua foto do perfil

Ricardo Alves

continuando a pergunta teria como retira essas acentuações automaticamente ao descompacta na pasta do servidor? deixa os nomes dos arquivos sem acentos?

15 de Janeiro de 2014 - 10:11

Sua foto do perfil

Mauricio Programador

Olá,

sim e possível, você vai ter que descompactar, depois listar dos arquivos da pasta (Listar Arquivos do Diretório) e ir renomeando cada um dos arquivos (Renomear Arquivos ou Pasta).

Abraço.

15 de Janeiro de 2014 - 10:13

Sua foto do perfil

Ricardo Alves

Esse script de remoção de acentos ficaria na mesma pagina do de descompactação?

20 de Janeiro de 2014 - 09:39

Sua foto do perfil

Mauricio Programador

Oi Ricardo,

isso mesmo, junto com o código que faz a descompactação, podes colocar na mesma ação.

Abraço.

20 de Janeiro de 2014 - 09:39

Sua foto do perfil

Ricardo Alves

MAURICIO O CODIGO NÃO DEU ERRO MAS TBM NÃO RETIROU ACENTUAÇÃO DO ARQUIVOS QUANDO DESCOMPACTA NA PASTA. :(

EX: "ó" fica "¢" e outros erros.

CODIGO COMPLETO:



$comAcentos = array('à', 'á', 'â', 'ã', 'ä', 'å', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ù', 'ü', 'ú', 'ÿ', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'O', 'Ù', 'Ü', 'Ú');

$semAcentos = array('a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'y', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'N', 'O', 'O', 'O', 'O', 'O', '0', 'U', 'U', 'U');

$stringExemplo = 'É vamos retirar a acentuação.';

echo str_replace($comAcentos, $semAcentos, $stringExemplo);
//Resultado: E vamos retirar a acentuacao.
?>
$colname_des = "-1";
if (isset($_GET['id_show'])) {
$colname_des = (get_magic_quotes_gpc()) ? $_GET['id_arquivo] : addslashes($_GET['id_show']);
}
mysql_select_db($database_musicnotstop, $musicnotstop);
$query_des = sprintf("SELECT * FROM shows WHERE id_show = %s", $colname_des);
$des = mysql_query($query_des, $musicnotstop) or die(mysql_error());
$row_des = mysql_fetch_assoc($des);
$totalRows_des = mysql_num_rows($des);
$arquivo = getcwd().'/zip/'.$row_des['descricao'];
$destino = getcwd().'/zip/'.$row_des['id_arquivo'];

$zip = new ZipArchive;
$zip->open($arquivo);
if($zip->extractTo($destino) == TRUE)
{
echo 'Arquivo enviado com sucesso.';
}
else
{
echo 'O Arquivo não pode ser enviado.';
}
$zip->close();

mysql_free_result($des);
?>

REDIMENCIONANDO A PAGINA, AGUARDE...

20 de Janeiro de 2014 - 16:26

Sua foto do perfil

Mauricio Programador

Olá Ricardo,

a codificação de caracteres que esta gerando é diferente, porém basta ir adicionando aos arrays os acentos com seus respectivos caracteres que vai funcionar.

$comAcentos = array('à', 'á', 'â', 'ã', 'ä', 'å', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ù', 'ü', 'ú', 'ÿ', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'O', 'Ù', 'Ü', 'Ú', '¢');

$semAcentos = array('a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'y', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'N', 'O', 'O', 'O', 'O', 'O', '0', 'U', 'U', 'U', 'o');

(acrescentei só o ultimo caractere).


Abraço.

20 de Janeiro de 2014 - 16:28

Sua foto do perfil

Ricardo Alves

Desisto cara já tentei de tudo mas nada resolveu. se me ajuda nesse erro posso coloca seu nome do rodapé do site se deseja é claro.

passo todas as informações necessárias pelo SKYPE: flashmx10@hotmail.com

24 de Janeiro de 2014 - 14:36

Sua foto do perfil

Mauricio Programador

Te mandei um e-mail, vamos conversando por lá que te ajudo.

24 de Janeiro de 2014 - 14:37

Sua foto do perfil

Bonfim Jr

Mauricio como seria no caso que eu quiser extrair um arquivo RAR?
outra coisa em $destino = getcwd().'/musicas/.$row_des['id_show'].';
Mas deus erro na linha 20:echo 'O Arquivo não pode ser descompactado.';
}

O QUE SERIA? DESDE JÁ AGRADEÇO A ATENÇÃO.

04 de Janeiro de 2014 - 16:17

Sua foto do perfil

Mauricio Programador

Olá Bonfim,

nesta linha que você mandou ($destino = getcwd().'/musicas/.$row_des['id_show'].';) o erro parece estar na concatenação, deixe ela assim e veja se funciona:

$destino = getcwd().'/musicas/'.$row_des['id_show'];

Quanto ao arquivos do tipo RAR basta instalar um pacote que esta neste link http://pecl.php.net/package/rar, e depois usar o código abaixo:


$rar_file = rar_open('NOME_ARQUIVO');

$entries = rar_list($rar_file);

foreach ($entries as $entry)
{
$entry->extract('/z_testando/');
}

rar_close($rar_file);

?>

O grande problema disso e que eu não conheço nenhum servidor de hospedagem que tenha este pacote instalado.

Por tanto se você não tiver como fazer esta instalação no seu servidor e bom rever a utilidade neste caso.

Espero ter ajudado.

Grande abraço.

05 de Janeiro de 2014 - 00:30

Sua foto do perfil

Bonfim Junior

infelizmente continuou o erro :/

o destino não reconhece o id_show como um nome de pasta.

Parse error: syntax error, unexpected T_STRING in /home/storage/a/b3/6c/rntvsat/public_html/recbook/des.php on line 13

CODIGO COMPLETO:


$colname_des = "-1";
if (isset($_GET['id_show'])) {
$colname_des = (get_magic_quotes_gpc()) ? $_GET['id_show'] : addslashes($_GET['id_show']);
}
mysql_select_db($database_musicnotstop, $musicnotstop);
$query_des = sprintf("SELECT * FROM shows WHERE id_show = %s", $colname_des);
$des = mysql_query($query_des, $musicnotstop) or die(mysql_error());
$row_des = mysql_fetch_assoc($des);
$totalRows_des = mysql_num_rows($des);
$arquivo = getcwd().'/musicas/zip/'.$row_des['descricao'].';
$destino = getcwd().'/musicas/'.$row_des['id_show'];

$zip = new ZipArchive;
$zip->open($arquivo);
if($zip->extractTo($destino) == TRUE)
{
echo 'Arquivo enviado com sucesso.';
}
else
{
echo 'O Arquivo não pode ser descompactado.';
}
$zip->close();

mysql_free_result($des);
?>

05 de Janeiro de 2014 - 10:01

Sua foto do perfil

Mauricio Programador

Bom dia Bonfim,

tente assim:

$colname_des = "-1";
if (isset($_GET['id_show'])) {
$colname_des = (get_magic_quotes_gpc()) ? $_GET['id_show'] : addslashes($_GET['id_show']);
}
mysql_select_db($database_musicnotstop, $musicnotstop);
$query_des = sprintf("SELECT * FROM shows WHERE id_show = %s", $colname_des);
$des = mysql_query($query_des, $musicnotstop) or die(mysql_error());
$row_des = mysql_fetch_assoc($des);
$totalRows_des = mysql_num_rows($des);
$arquivo = getcwd().'/musicas/zip/'.$row_des['descricao'];
$destino = getcwd().'/musicas/'.$row_des['id_show'];

$zip = new ZipArchive;
$zip->open($arquivo);
if($zip->extractTo($destino) == TRUE)
{
echo 'Arquivo enviado com sucesso.';
}
else
{
echo 'O Arquivo não pode ser descompactado.';
}
$zip->close();

mysql_free_result($des);


Abraço.

05 de Janeiro de 2014 - 10:02

Sua foto do perfil

Marcelo Sena

Qual o erro Mauricio?

Warning: ZipArchive::extractTo() [ziparchive.extractto]: Invalid or unitialized Zip object in /home/storage/a/b3/6c/rntvsat/public_html/recbook/des.php on line 7
O Arquivo não pode ser descompactado.
Warning: ZipArchive::close() [ziparchive.close]: Invalid or unitialized Zip object in /home/storage/a/b3/6c/rntvsat/public_html/recbook/des.php on line 15

<?php
$arquivo = getcwd().'musicas/zip/NOVO.zip';
$destino = getcwd().'musicas/111/';

$zip = new ZipArchive;
$zip->open($arquivo);
if($zip->extractTo($destino) == TRUE)
{
echo 'Arquivo descompactado com sucesso.';
}
else
{
echo 'O Arquivo não pode ser descompactado.';
}
$zip->close();
?>

02 de Janeiro de 2014 - 13:24

Sua foto do perfil

Mauricio Programador

Olá Marcelo,

ajusta uma coisa e confere outra.

Ajuste estas linhas:
$arquivo = getcwd().'musicas/zip/NOVO.zip';
$destino = getcwd().'musicas/111/';

para:
$arquivo = getcwd().'/musicas/zip/NOVO.zip';
$destino = getcwd().'/musicas/111/';

Faltou uma barra.

e confere se a versão do teu PHP é 5.2.0 ou superior, pois e a partir daí que esta biblioteca vem nativa no PHP.

Grande Abraço.

02 de Janeiro de 2014 - 14:03

NEWSLETTER

Receba dicas de programação
em seu e-mail

TWITTER

Acompanhe tudo o que rola
com Mauricio Programador

NEWSLETTER