Como compactar arquivos no CodeIgniter usando a biblioteca Zip

Como compactar arquivos no CodeIgniter usando a biblioteca Zip

15/04/2016 5 Por Jonathan Lamim

Às vezes é necessário fazer a compressão/compactação de um conjunto arquivos – alguns conhecem como "zipar" – ou mesmo um único arquivo de tamanho maior, para disponibilizar para o usuário. No CodeIgniter fazemos isso através da Biblioteca Zip Encoding, que vou apresentar o funcionamento ao longo desse tutorial.

Com o CodeIgniter instalado vamos seguir o passo-a-passo para compreender e aprender o processo de compressão.

Passo 1 – Configurações

Antes de começar a criar a view e o controller, precisamos fazer algumas configurações.

Bibliotecas e Helpers

Precisamos carregar algumas bibliotecas e helpers para esse tutorial. Abra o arquivo application/config/autoload.php e atualize o conteúdo dele conforme o código abaixo, onde carregamos as bibliotecas session e zip e o helper url:

$autoload['libraries'] = array('session','zip');
$autoload['helper'] = array('url');

Tudo o que for especificado no arquivo autoload.php será carregado na inicialização da aplicação e ficará disponível por toda ela.

Rotas

Precisamos criar 2 rotas para executar os processos de compactação que serão apresentados nesse tutorial. Abra o arquivo application/config/routes.php e atualize as rotas conforme o código a seguir:

$route['default_controller'] = 'Base';
$route['comprimir-texto'] = 'Base/ComprimirTexto'
$route['comprimir-arquivos'] = 'Base/ComprimirArquivos'

Para default_controller foi informado Base que será o nome do controlador padrão usado na aplicação. As outras duas rotas são:

  • comprimir-texto: chama o método ComprimirTexto
  • comprimir-arquivos: chama o método ComprimirArquivos

Concluídas as configurações, vamos criar a view.

Passo 2 – Criando a view

Para esse tutorial teremos uma única view, que conterá um formulário com um campo de texto e um botão. E também um pequeno texto com um link.

O código abaixo corresponde somente ao conteúdo com o formulário e o texto, o cabeçalho HTML obrigatório para páginas web deve ser inserido por você no ato da criação da view.

Crie um arquivo chamado home.php no diretório application/views para inserir o código abaixo:

<div>
    <p>Digite no campo abaixo um texto para adicionar em um arquivo comprimido (ZIP).</p>
    <form method="POST" action="<?=base_url('comprimir-texto')?>">
        <div>
            <textarea name="texto" class="form-control" rows="10" required></textarea>
        </div>
        <div>
            <input type="submit" value="Comprimir" class="btn btn-success" />
        </div>
    </form>
</div>

<div>
    <p>Para comprimir os arquivos do diretório <em>files</em>, clique <a href="<?=base_url('comprimir-arquivos')?>">aqui</a>.</p>
    <?php if ($this->session->flashdata('error') == TRUE): ?>
    <div><?= $this->session->flashdata('error'); ?></div>
    <?php endif; ?>
</div>

Repare que o atributo action do formulário está recebendo a rota comprimir-texto e o link a rota comprimir-arquivos.

Ao final do arquivo é adicionado um if para verificar a ocorrência de erro. Caso tenha ocorrido algum erro durante o processamento da compressão, este será exibido.

Passo 3 – Criando o controller

O controlador desse tutorial será composto por 3 métodos:

  • Index: que carregará a view home.php
  • ComprimirTexto: fará a compressão do texto, seguido do download do arquivo comprimido
  • ComprimirArquivos: fará a compressão dos arquivos contidos no diretório files

Antes de criar o controlador, crie um diretório chamado files na raiz da aplicação.

Com o diretório criado, agora você vai criar um arquivo chamado Base.php dentro do diretório application/controllers, e vai colocar o código abaixo nele:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Base extends CI_Controller {

    public function Index()
    {
        // Carrega a view home.php
        $this->load->view('home');
    }

    // Comprime o texto enviado pelo formulário
    public function ComprimirTexto(){

        $texto = $this->input->post('texto');

        // Adiciona o texto em um arquivo txt
        $this->zip->add_data('meu-texto.txt', $texto);

        // Cria o arquivo ZIP no servidor
        if($this->zip->archive('./files/zip/meu_texto.zip')){
            // Faz o download do arquivo comprimido
            $this->zip->download('meu_texto.zip');
        }else{
            // Define a mensagem de erro a ser exibida para o usuário
            $this->session->set_flashdata('error','Não foi possível gerar o arquivo comprimido.');
            //redireciona para a página principal (home.php)
            redirect();
        }
    }

    // Comprime os arquivos contidos no diretório file
    public function ComprimirArquivos(){

        // Faz a leitura do diretório a ser comprimido
        if($this->zip->read_dir('./files')){
            // Faz o download do arquivo comprimido
            $this->zip->download('meus_arquivos.zip');
        }else{
            // Define a mensagem de erro a ser exibida para o usuário
            $this->session->set_flashdata('error','Não foi possível gerar o arquivo comprimido.');
            //redireciona para a página principal (home.php)
            redirect();
        }
    }

}

Em momento algum dentro dos métodos do controlador Base foi preciso chamar $this->load->library(), pois o carregamento das bibliotecas necessárias foi feito no autoload, tornando os seus recursos disponíveis por toda a aplicação.

Os métodos utilizados para os processos de compressão foram:

  • $this->zip->add_data(): adiciona um conteúdo para um arquivo; recebe como primeiro parâmetro o nome do arquivo com a extensão e como segundo parâmetro o conteúdo a ser adicionado ao arquivo
  • $this->zip->archive(): cria o arquivo físico, do tipo ZIP, no servidor; recebe como parâmetro o path completo de onde o arquivo será gravado, incluindo o nome do arquivo
  • $this->zip->download(): força o download do arquivo que acabou de ser gravado no servidor; recebe como parâmetro o nome que esse arquivo ZIP terá
  • $this->zip->read_dir(): faz a leitura dos arquivos de um diretório, adicionando-os automaticamento em um ZIP – sem gravar no disco – para download; recebe como parâmetro o path desse diretório

Com poucas linhas de código foi possível criar um processo de compressão de arquivos usando o CodeIgniter. Também é possível fazer isso utilizando o PHP puro, sem o auxílio de um framework, mas com um framework o trabalho fica mais rápido e você ganha em produtividade.

Para ver como fazer a descompressão de arquivos ZIP no CodeIgniter, acesse o tutorial Como descompactar arquivos no CodeIgniter.

Você pode fazer o download dos arquivos criados nesse tutorial clicando no botão abaixo.

Download do código-fonte

Bons estudos!!!