+4

Gerando Arquivos ZIP Dinamicamente

criado por Rodrigo Romano Moreira em 21/05/2002 5:51pm
Um bom habito para aprender programar em qualquer linguagem é estudar códigos já prontos.

Eu tinha acabado de baixar o phpMyAdmin 2.2.6 ( http://phpmyadmin.sourceforge.net ), e após configurá-lo comecei a fuçar nos scripts contidos. Achei um script com nome zip.lib.php e passei a “brincar com ele”.

Mas antes que vocês possam “brincar” também, é necessário habilitar a biblioteca Zlib (funções para compressão de dados - http://www.php.net/manual/pt_BR/ref.zlib.php).

Em algumas versões do PHP para win32 é só editar o arquivo php.ini, indo na linha que contém ;extension=php_zlib.dll ,retirando o “;”.

O script do zip.lib.php :

<?php
class zipfile
{
    /**
     * Array para armazenar dados comprimidos
     *
     * @var  array    $datasec
     */
    var $datasec      = array();

    /**
     * diretório central 
     *
     * @var  array    $ctrl_dir
     */
    var $ctrl_dir     = array();

    /**
     * Fim do registro do diretório central
     *
     * @var  string   $eof_ctrl_dir
     */
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";

    /**
     * Posição do último offset
     *
     * @var  integer  $old_offset
     */
    var $old_offset   = 0;


    /**
     * Converte a data no formato Unix para formato DOS 
     * 
     */
    function unix2DosTime($unixtime = 0) {
        $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

        if ($timearray['year'] < 1980) {
                $timearray['year']    = 1980;
                $timearray['mon']     = 1;
                $timearray['mday']    = 1;
                $timearray['hours']   = 0;
                $timearray['minutes'] = 0;
                $timearray['seconds'] = 0;
        } // end if

        return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
                ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
    } 


    /**
     * Adiciona um  "arquivo" no  formato zip.
     */
    function addFile($data, $name, $time = 0)
    {
        $name     = str_replace('\\', '/', $name);

        $dtime    = dechex($this->unix2DosTime($time));
        $hexdtime = '\x' . $dtime[6] . $dtime[7]
                  . '\x' . $dtime[4] . $dtime[5]
                  . '\x' . $dtime[2] . $dtime[3]
                  . '\x' . $dtime[0] . $dtime[1];
        eval('$hexdtime = "' . $hexdtime . '";');

        $fr   = "\x50\x4b\x03\x04";
        $fr   .= "\x14\x00";           
        $fr   .= "\x00\x00";            
        $fr   .= "\x08\x00";            
        $fr   .= $hexdtime;             

        
        $unc_len = strlen($data);
        $crc     = crc32($data);
        $zdata   = gzcompress($data);
        $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); 
        $c_len   = strlen($zdata);
        $fr      .= pack('V', $crc);             
        $fr      .= pack('V', $c_len);          
        $fr      .= pack('V', $unc_len);         
        $fr      .= pack('v', strlen($name));    
        $fr      .= pack('v', 0);                
        $fr      .= $name;

    
        $fr .= $zdata;


        $fr .= pack('V', $crc);                 
        $fr .= pack('V', $c_len);               
        $fr .= pack('V', $unc_len);             

        
        $this -> datasec[] = $fr;
        $new_offset        = strlen(implode('', $this->datasec));

        
        $cdrec = "\x50\x4b\x01\x02";
        $cdrec .= "\x00\x00";                
        $cdrec .= "\x14\x00";                
        $cdrec .= "\x00\x00";                
        $cdrec .= "\x08\x00";                
        $cdrec .= $hexdtime;                 
        $cdrec .= pack('V', $crc);           
        $cdrec .= pack('V', $c_len);         
        $cdrec .= pack('V', $unc_len);       
        $cdrec .= pack('v', strlen($name) ); 
        $cdrec .= pack('v', 0 );             
        $cdrec .= pack('v', 0 );             
        $cdrec .= pack('v', 0 );             
        $cdrec .= pack('v', 0 );             
        $cdrec .= pack('V', 32 );            

        $cdrec .= pack('V', $this -> old_offset ); 
        $this -> old_offset = $new_offset;

        $cdrec .= $name;

        
        $this -> ctrl_dir[] = $cdrec;
    } 


    /**
     * 
     *
     * Retorna um  string contento um arquivo zip
     *
     * 
     */
    function file()
    {
        $data    = implode('', $this -> datasec);
        $ctrldir = implode('', $this -> ctrl_dir);

        return
            $data .
            $ctrldir .
            $this -> eof_ctrl_dir .
            pack('v', sizeof($this -> ctrl_dir)) .  
            pack('v', sizeof($this -> ctrl_dir)) .  
            pack('V', strlen($ctrldir)) .           
            pack('V', strlen($data)) .              
            "\x00\x00";                             
    } 
} 
?>

Comentários:

Mostrando 1 - 10 de 13 comentários
Por exemplo eu envio um arquivo zip p o servidor e este dezipa e poe os arquivos e nao o zip, ex: fotos;
28/02/2007 12:19pm (~18 anos atrás)

Eu gostaria de saber como faria para compactar alguns diretorios no meu site com essa classe.

Desculpem a ignorancia, é que sou programador coldfusion, e estou engatinhando no PHP, alguém poderia me dar um help?
29/06/2006 7:26am (~18 anos atrás)

Eu estou com um problema quando o download é muito grande tipo 15 mega quando chega a + ou - 40% ele para de baixar diz q a rede foi reconfigurada porq ?
alguem pode me ajudar.
a configuração do download:

$tamanho=strlen($arquivozip);
header("Content-Type: application/octet-stream; name=".$arquivo);
header("Content-Length: ".$tamanho);
header("Content-Transfer-Encoding: binary");
header("Accept-Ranges: none");
header("Content-Disposition: attachment; filename=".$arquivo."\n");
echo $arquivozip;
29/03/2006 3:52pm (~18 anos atrás)

Tem como eu colocar uma mensagem de operção efetuada com sucesso! ou uma de Erro !?
10/12/2004 7:38am (~20 anos atrás)

Hugo Calixto disse:
Fala ae Rodrigo,

Quase estava ficando louco de procurar uma classe que zipasse.

Crio alguns txt´s e agora graças a esse artigo, faço zip deles, agora queria pedir uma ajuda ou uma sugestão. Esses txt´s que gero eles vão com conteúdo em fomato cvs, daí um software lê eles e faz as devidas atualizações, meu pedido é o seguinte :

Zipar e por uma senha no arquivo
ou
Criptografar os dados de um campo (apenas um campo - o senha), quando gerar o txt

Abaixo segue o script que gera o txt.

<?
include("../config.php");
$db = mysql_connect($host, $user, $pass); //conectamos ao mysql
$basedados = mysql_select_db($base); //selecionamos o database escolhido

//Gera O autoridade.txt
// Pega os Dados de seu Banco (No exmplo uso MySQL www.mysql.org)
$sql_sales = mysql_query("SELECT * FROM autoridade ");
$contagem = mysql_num_rows($sql_sales); //traz o resultado da pesquisa acima
// Cria uma Varaivel e Lista
$arquivo = 'autoridade';
while ($datas = mysql_fetch_array($sql_sales)) {
$arquivo_text .= "$datas[id], '$datas[senha]', '$datas[nomeprofissional]', '$datas[orgao]', '$datas[cargo]', '$datas[setor]', '$datas[posicao]'\n";
}

$exte = (isset($cvs)) ? '.cvs' : '.txt';
$abbre = fopen(autoridade.$exte, "w+");
fwrite($abbre, $arquivo_text);
fclose($abbre);
?>


Meu problema é ir os dados do campo senha, os demais dados é tranquilo

Ah ! o software do cara é em delphi

Se puder me ajudar ficarei muito agradecido

Muito obrigado

email : calixtorj@hotmail.com

Hugo

25/11/2004 12:39am (~20 anos atrás)

Cristiano disse:
Olá amigos.

Por acaso php_zip.dll tem as mesmas funções que php_zlib.dll, pois quando tento carregar ambas, recebo várias mensagens de erro.
Então resolvi deixar apenas a php_zip.dll, mas o interessante é que ao consultar a função phpinfo() percebi que a zlib estava rodando.
Estou meio confuso quanto a isso.

Alguém pode clarear minhas idéias?

[]s

Cristiano
kinhu@tijucas.com
25/04/2004 10:48am (~20 anos atrás)

Bom ,no mysql (via terminal) você pode usar o comando
mysqldunp seu_bando_de_dump > backup.sql.
Agora via php ,tenho que criar.
24/06/2002 11:28am (~22 anos atrás)

Eu uso phptriad tambem,a biblioteca zlib já vem instalada.
15/06/2002 2:53pm (~22 anos atrás)

Não sei qual é o problema,mas posso enviar o meu arquivo que eu uso.
11/06/2002 7:11am (~22 anos atrás)

http://kromann.info/php4.php, legal que ele tem todos dll´s para win32(até gd).
24/05/2002 10:10pm (~22 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)