publicidade

Compactando e Descompactando arquivos com PHP

Em agum momento do seu trabalho você pode ter a necessidade de compactar um ou vários arquivos em um formato zip. Aconteceu comigo quando precisei implementar no meu sistema uma rotina para fazer o backup das tabelas do banco de dados e realizar a restauração em um eventual problema. Então vou postar aqui um exemplo básico de como fazer esse processo que pode servir como ponto de partida para a criação de uma rotina mais completa e que atenda as necessidades específicas de cada projeto. Nós usaremos uma classe do PHP, a ZipArchive para fazer a compactação. 

Na imagem a seguir temos a estrutura do nosso diretório. A pasta "folder_to_compact" contém os arquivos que vamos compactar e descompactar como teste, a pasta "temp" será o local onde salvaremos os arquivos .zip que vamos criar e pasta "extract" será usada para os testes de descompactação.

Então vamos lá!! Primeiro criamos uma instância da classe ZipArchive e definimos o nome no arquivo que estamos criando.

# instanciamos a classe
$zip = new ZipArchive();
# definimos um nome para o arquivo que vamos criar
$filename = getcwd() . "/temp/compact.zip";

Agora tentamos criar o arquivo. Se tudo der certo, o arquivo será criado e estará pronto para inserirmos os arquivos nele, caso tenha ocorrido algum erro e não pudermos manipular o nosso arquivo zip, encerraremos a rotina.

if ($zip->open( $filename, ZipArchive::CREATE )!==TRUE) { 
    exit("Não foi possível criar o arquivo '$filename'\n");
}

Criado o arquivo zip, podemos adicionar os itens (arquivos) e para isso usaremos o método "addFile". Este método utiliza dois parâmetros: o primeiro é o caminho/nome do arquivo a ser adicionado e o segundo, o caminho/nome que ele terá dentro do Zip.

#definimos que arquivo vamos adicionar ao zip.
$file_to_add = "Planilha do Excel.xlsx";
# montamos o caminho completo do arquivo
$add = getcwd() . "/folder_to_compact/$file_to_add";
# realizamos a inserção
$zip->addFile( $add ,"/$file_to_add");

Podemos usar a propriedade "numFiles" para exibir a quantidade de arquivos inseridos e depois fechamos o arquivo

# impimimos na tela a quntidade de arquivos que foram inseridos no zip
echo "Quantidade de Arquivos no Zip: " . $zip->numFiles . "<br>";
# Fechamos o Arquivo.
$zip->close();

Se deu tudo certo, já foi criado o arquivo "compact.zip" na pasta "temp" e agora dando continuidade, vamos abrir o arquivo que acabamos de criar e extrair os arquivos compactados anteriormente para a pasta "extract".

# Tentamos carregar o arquivo .zip e se der certo procederemos com a extração
if( $zip->open( $filename ) === TRUE ) {

    # usamos o metodo "extractTo" para realizar a extração.
	$extract = $zip->extractTo( 'extract' );
    # verificamos se a extração foi feita e informamos o resultado.
	if( $extract ) echo "Arquivo(s) Extraido(s).<br>";
    # Feccamos o arquivo.
	$zip->close();
} 

Outra condição que podemos desejar é inserir mais de um arquivo no zip, ou até mesmo uma pasta inteira.

# Definimos o nome no arquivo que estamos criando.
$filename = getcwd() . "/temp/multiples.zip";

# Tentamos criar o arquivo. Se não for possível, encerramos a rotina.
if ( $zip->open($filename, ZipArchive::CREATE)!== TRUE ) { 
    exit("Não foi possível criar o arquivo '$filename'\n");
} else {

	# Definimos uma pasta onde pegaremos todos os arquivos e vamos inserir todos eles no zip.
	$folder = "folder_to_compact";
	# Criamos uma matriz com os nomes dos arquivos que estão na pasta usando a função glob do PHP.
	$files_in_folder = glob( $folder . "/*");
	# Executamos um loop na matriz com os nomes e adicionamos cada arquivo encontrado na pasta em nosso Zip.
	foreach( $files_in_folder as $file ){
		$zip->addFile( $file, basename( $file ) );
	}
	# Encerrada a tarefa, fechamos o arquivo.
	$zip->close();
}

Dependendo do seu propósito, pode ser necessário descarregar o arquivo para o computador do usuário. Se esse for o caso, poderá usar a rotina abaixo para forçar o download do arquivo.

header('Content-Type: application/zip');
header("Content-Disposition: attachment; filename=\"". basename( $filename ) ."\""); 
header('Content-Length: ' . filesize( $filename ));
readfile( $filename );

Quando geramos um arquivo no site para enviar para o usuário, geralmente ele não terá uso depois e por isso apagamos para liberar espaço em disco. Se for o seu caso, você pode usar o comando "unlink" para remover o arquivo do servidor. Para efeito do estudo deixei a linha comentada para que o arquivo seja mantido e você veja que ele está lá. Você pode descomentar para ver a exclusão acontecer.

# o comando "unlink" removerá o arquivo depois que o download for realizado.
//unlink( $filename );

Neste ponto nosso código está completo e se você fizer como eu e colocar todo ele em sequência, ele realizará as seguintes tarefas:

1) o arquivo "compact.zip" será criado;
2) o arquivo "Planilha do Excel.xlsx" sera adicionado ao "compact.zip";
3) o arquivo "compact.zip" será reaberto e extrairemos o arquivo "Planilha do Excel.xlsx" para a pasta "extract";
4) o arquivo "multiples.zip" será criado e todos os arquivos da pasta "folder_to_compact" serão adicionados a ele;
5) será iniciado o download do arquivo "multiples.zip" para o computador do usuário.
6) se o comando "unlink" for descomentado, o arquivo "multiples.zip" será excluído.

Abaixo uma imagem das pasta após a execução do coódigo:

Compactando e Descompactando arquivos com PHP

Em agum momento do seu trabalho você pode ter a necessidade de compactar um ou vários arquivos em um formato zip. Aconteceu comigo quando...

publicidade

Deixe um comentário:


Deixe seu comentário. Só serão exibidos comentários ligados ao texto do post. Links serão removidos.

Comentários: