Compactando pastas em arquivos ZIP com PHP


Este é mais um artigo sobre recursos úteis a serem adicionados em sistemas de informação para WEB. Já vimos nos artigos anteriores dicas importantes e úteis como;

Criando arquivos PDF com jQuery e Convert Api
Como criar um arquivo do Word (.DOC) com PHP
Como gerar um arquivo do Excel com PHP

E agora vamos aprender a compactar uma pasta com PHP. Este recurso é útil para sistemas WEB que possuem sistemas de Uploads de arquivos, ou sistema que necessitam gerar backups php periódicamente de determinadas pastas (Uma pasta que armazena XML de NF-e por exemplo);

Código PHP para compactar uma pasta

Para exemplificar este código eu criei a seguinte estrutura de arquivos e pastas;

É importante saber que as pastas imagens, pasta 01 e pasta 02 não estão vazias, caso contrário elas não serão compactadas.

Note também que temos dois arquivos PHP, sendo o index.php e o backup-zip.php, vamos programar primeiro o backup-zip.php contendo o seguinte código;

<?php
// Define o nome do nosso pacote Zip.
$arquivo = 'backup.zip';

// Apaga o backup anterior para que ele não seja compactado junto com o atual.
if (file_exists($arquivo)) unlink(realpath($arquivo)); 

// diretório que será compactado
$diretorio = "./"; // aqui estou compactando a pasta raiz do sistema.
$rootPath = realpath($diretorio);

// Inicia o Módulo ZipArchive do PHP
$zip = new ZipArchive();
$zip->open($arquivo, ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Compactação de subpastas
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

// Varre todos os arquivos da pasta
foreach ($files as $name => $file)
{
    if (!$file->isDir())
    {
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Adiciona os arquivos no pacote Zip.
        $zip->addFile($filePath, $relativePath);
    }
}

// Encerra a criação do pacote .Zip
$zip->close();

   $arquivo = 'backup.zip'; // define o nome do pacote Zip gerado na 9
   if(isset($arquivo) && file_exists($arquivo)){ // faz o teste se a variavel não esta vazia e se o arquivo realmente existe
      switch(strtolower(substr(strrchr(basename($arquivo),"."),1))){ // verifica a extensão do arquivo para pegar o tipo
         case "pdf": $tipo="application/pdf"; break;
         case "exe": $tipo="application/octet-stream"; break;
         case "zip": $tipo="application/zip"; break;
         case "doc": $tipo="application/msword"; break;
         case "xls": $tipo="application/vnd.ms-excel"; break;
         case "ppt": $tipo="application/vnd.ms-powerpoint"; break;
         case "gif": $tipo="image/gif"; break;
         case "png": $tipo="image/png"; break;
         case "jpg": $tipo="image/jpg"; break;
         case "mp3": $tipo="audio/mpeg"; break;
         case "php": // deixar vazio por segurança
         case "htm": // deixar vazio por segurança
         case "html": // deixar vazio por segurança
      }
      header("Content-Type: ".$tipo); // informa o tipo do arquivo ao navegador
      header("Content-Length: ".filesize($arquivo)); // informa o tamanho do arquivo ao navegador
      header("Content-Disposition: attachment; filename=".basename($arquivo)); // informa ao navegador que é tipo anexo e faz abrir a janela de download, tambem informa o nome do arquivo
      readfile($arquivo); // lê o arquivo
      exit; // aborta pós-ações
   }
?>

Agora vamos programar o index.php, ele na verdade terá apenas um link para o arquivo backup-zip.php;

<a href="backup-zip.php">Fazer backup dos arquivos</a>

O legal é que quando clicarmos no link o arquivo de backup forçará o download.

Sistema de compactação de arquivos em PHP – Exemplo para download

Como é de praxe, todos os exemplos mostrados no Blogson também são disponibilizados para download. Se você gosta dos artigos publicados no Blogson não esqueça de nos seguir no Facebook e deixar o seu Like.

Faça o download aqui

compactar arquivos com phpcompactar pastas com PHPcriar arquivos ZIP com PHPexemplo PHP para compactar ZIPscript de backup PHPscript de compactação de arquivos PHP