PHP
- 11/02/2010
Compactar arquivos com PHP
Olá pessoal, hoje vou mostrar como fazer para compactar arquivo com PHP. O procedimento é muito simples, caso seu servidor esteja com o zlib habilitada basta executar um código mais ou menos assim:
-
<?
-
/**
-
* Insere um arquivo dentro de um zip.
-
*
-
* @param String $name_of_zip Nome do arquivo ZIP que será trabalhado.
-
* @param String $path_file Path original do arquivo que vai para o ZIP
-
* @param String $file_name Nome do arquivo dentro do ZIP
-
* @return Mixed
-
*/
-
function fileToZip($name_of_zip=null, $path_file=null, $file_name=null){
-
return ‘Todos os parâmetros são obrigatórios’;
-
}
-
-
// Cria a instancia do ZIP
-
$zip = new ZipArchive;
-
// se conseguir criar o arquivo ZIP
-
if( $zip->open($name_of_zip, ZIPARCHIVE::CREATE) === true ){
-
// Adiciona o arquivo dentro do zip
-
$zip->addFile($path_file, $file_name);
-
$zip->close(); // fecha a conexão com o ZIP
-
// Opcionalmente pode-se excluir o arquivo original, basta inserir uma variável nos parâmetros
-
//unlink(‘/path/do/arquivo/arquivo.php’);
-
return true;
-
} else {
-
return false;
-
}
-
}
-
?>
Este post é uma complementação do Como descompactar arquivos com PHP e juntos podem virar uma classe muito útil.
Vamos ver se funciona? vou jogar esta função e a função do post anterior em um arquivo e rodar para ver se o arquivo foi criado corretamente:
-
<?
-
/**
-
* Insere um arquivo dentro de um zip.
-
*
-
* @param String $name_of_zip Nome do arquivo ZIP que será trabalhado.
-
* @param String $path_file Path original do arquivo que vai para o ZIP
-
* @param String $file_name Nome do arquivo dentro do ZIP
-
* @return Mixed
-
*/
-
function fileToZip($name_of_zip=null, $path_file=null, $file_name=null){
-
return ‘Todos os parâmetros são obrigatórios’;
-
}
-
-
// Cria a instancia do ZIP
-
$zip = new ZipArchive;
-
// se conseguir criar o arquivo ZIP
-
if( $zip->open($name_of_zip, ZIPARCHIVE::CREATE) === true ){
-
// Adiciona o arquivo dentro do zip
-
$zip->addFile($path_file, $file_name);
-
$zip->close(); // fecha a conexão com o ZIP
-
// Opcionalmente pode-se excluir o arquivo original, basta inserir uma variável nos parâmetros
-
//unlink(‘/path/do/arquivo/arquivo.php’);
-
return true;
-
} else {
-
return false;
-
}
-
}
-
-
/**
-
* Esta função descompacta arquivos
-
* de um zip
-
*
-
* @param String $path Local do arquivo .zip
-
* @param String $pathunzip Pasta onde os arquivos devem ser descompactados
-
*/
-
function unZip($path, $pathunzip=‘.’){
-
# ===— Instancia a classe do Zip
-
$zip = new ZipArchive;
-
# ===— Tenta abrir o zip
-
if($zip->open($path)){
-
$return = $zip->extractTo($pathunzip); // executa o unzip
-
$zip->close(); // fecha a coneção com o .zip
-
} else {
-
echo ‘O arquivo não pode ser aberto.’;
-
}
-
}
-
-
/**
-
* Esta função retorna um array com
-
* os nomes dos arquivos que estão
-
* dentro do zip.
-
*
-
* @param String $path Local do arquivo .zip
-
* @return array ou false no caso de erro
-
*/
-
function zipToArray($path){
-
# ===— Instancia a classe
-
$zip = new ZipArchive;
-
# ====– Tenta abrir o zip
-
if($zip->open($path)){
-
# ===— Recupera o numero de arquivos do zip
-
$num_files = $zip->numFiles;
-
# ===— percorre os arquivos pegando os nomes e colocando em um array
-
for($i=0; $i<=($num_files)-1;$i++){
-
$saida[] = $zip->getNameIndex($i);
-
}
-
# ====— fecha a conexão
-
$zip->close();
-
# ====— Retora o array para ser manipulado
-
return $saida;
-
}
-
return false;
-
}
-
// adicionando os arquivos
-
fileToZip(‘./nome_do_zip.zip’, ‘./texto.txt’, ‘texto.txt’);
-
fileToZip(‘./nome_do_zip.zip’, ‘./texto.txt’, ‘texto2.txt’);
-
-
// lendo o zip criado para ver se tem algum arquivo dentro
-
?>
Veja o resultado:
Vou fazer um post sobre como criar uma classe com estas funcionalidades em breve.
Por hoje é isso…


(6 votos, média: 4.33 de 5)

4 Comentários to “Compactar arquivos com PHP”
Boa Marcelão… como sempre detonando nos posts!
Então, havia falado que tinha feito uma classe genérica, mas não está genérica não..rsrs.. mas como é um pouco diferente da sua, segue o código ai para sugestões e melhorias… está funcionando bem… mas quero trabalhar com a ideologia correta de OO… então me ajuda! :p
<?php
/**
* Classe Zipar – Para zipar imagens de um diret�rio
*
* @author Rafael Ortega Bueno
* @parametro $caminho = caminho da pasta
* @parametro $nome = nome do novo arquivo
**/
class Zipador {
public function zipar($caminho,$pasta){
$caminho = $caminho."/";
$tamanho = strlen("$pasta");
for($i = 0;$i < $tamanho; $i++){
if(substr($pasta,$i,1) == "/"){
$nomeArquivo = substr($pasta,($i+1),$tamanho);
}
}
//—-Acima Jhonatan
$dir = opendir($caminho);
$x = Array();
while($file = readdir($dir)){
array_push($x,$file);
}
for($i=0;$iopen(“{$new_name}.zip”, ZIPARCHIVE::CREATE) === true){
$zip->addFile($caminho.$x[$i],$x[$i]);
$zip->close();
print “Arquivo zipado com sucesso!”;
}
else{
print “Problemas ao zipar seu arquivo!”;
}
}
}
return “ Baixar Arquivo“;
//echo ” location.href =’$new_name.zip’ “;
}
//————————————
public function buscaNomePasta($id){
$banco = mysql_query(“SELECT arquivo FROM envio
WHERE idenvio = $id”);
while($linha = mysql_fetch_array($banco)){
$pasta = $linha['arquivo'];
}
return $pasta;
}
}
?>
Por Rafael Ortega Bueno (6 comments) em 12/02/2010
Pode me esclarecer uma dúvida?
Como faço para criar o arquivo em várias partes?
tenho uma cron que gera um backup (bd) e depois mando compactar… estava funcionando normalmente…
mas agora o backup esta com aproximadamente 200Mb.
e na hora de compactar da erro, ele não compacta…
pensei em compactar em várias partes… não sei se é possível..
obrigado
Por Laureano (1 comments) em 09/03/2011
cara gostei simples e objetiva.
obrigado.
Por Josué (4 comments) em 27/08/2011
<?php
//Autor : Estelvio Luis
//Data: 08/12/2011
//Monta o caminho
$dwloaddir = "caminho";
//Verifica se a pasta existe, se não cria
!is_dir($dwloaddir) ? mkdir($dwloaddir, 0777) : "";
$arquivo = fopen($dwloaddir."/"."teste_1.txt", "w");
for($i = 0; $i < 10; $i++) fwrite($arquivo, "testando testando testando testando\n");
fclose($arquivo);
$arquivo = fopen($dwloaddir."/"."teste_2.txt", "w");
for($i = 0; $i open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
exit(“Não foi aberto o arquivo \n”);
}
$zip->addFile($dwloaddir.”/teste_1.txt”,”teste_1.txt”);
$zip->addFile($dwloaddir.”/teste_2.txt”,”teste_2.txt”);
$zip->close();
?>
Por Estelvio (1 comments) em 06/12/2011