Compactação de arquivos com CodeIgniter

À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 library ‘Zip’, 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.

Temos um tutorial sobre como instalar o CodeIgniter, veja aqui.

Passo 1 – Configurações

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

Libraries e Helpers

Vamos precisar carregar algumas libraries 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 libraries ‘session’ e ‘zip’ e o helper ‘url’:

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

$autoload['helper'] = array('url');

Tudo o que for especificado no arquivo de ‘autoload.php’ será carregado na inicialização da aplicação.

Rotas

Vamos precisar 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 controller 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 vamos ter uma única view, que irá 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 controller 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 controller, 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 controller ‘Base’ foi preciso chamar ‘$this->load->library()’, pois o carregamento das libraries necessárias foram feitos 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, acesse a dica “Descompressão de arquivos com CodeIgniter”.

Bons estudos!!!

button-codigo-fonteDemo Online