Gerando Arquivos ZIP Dinamicamente
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 :
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";
}
}
?>
Páginas:
1
2

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?
Desculpem a ignorancia, é que sou programador coldfusion, e estou engatinhando no PHP, alguém poderia me dar um help?
29/06/2006 7:26am
(~19 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;
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
(~19 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)
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
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)
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
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
(~21 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.
mysqldunp seu_bando_de_dump > backup.sql.
Agora via php ,tenho que criar.
24/06/2002 11:28am
(~23 anos atrás)
Não sei qual é o problema,mas posso enviar o meu arquivo que eu uso.
11/06/2002 7:11am
(~23 anos atrás)
http://kromann.info/php4.php, legal que ele tem todos dll´s para win32(até gd).
24/05/2002 10:10pm
(~23 anos atrás)