Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fabyo

unzip

Recommended Posts

Como tem bastante gente com duvidas sobre descompactar um arquivo zip fiz essa função pra ajudar

 

http://br2.php.net/zip

CXL. Zip File Functions (Read Only Access) ( Somente leitura)
Observe que a ZZIPlib provem apenas uma biblioteca de funções para ler arquivos ZIPados

 

para baixar essa dll baixe ela aqui http://pecl.php.net/package/zip ou baixe logo o pacote completo do pecl no http://php.net/downloads

 

descomente a linha do php.ini: extension=php_zip.dll se ela nao existir crie ela

 

a função que descompacta:

 

<?

function unzip($file)
{
if(pathinfo($file, PATHINFO_EXTENSION) != "zip") {
	return false;
}
if ($zip = zip_open(getcwd(). "\\$file")) {
	if(!file_exists(basename($file, ".zip"))) {
		mkdir(basename($file, ".zip"));
	}
	while ($zip_entry = zip_read($zip)) {
		if (zip_entry_open($zip, $zip_entry, "r")) {
			$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
			$dir_name = dirname(zip_entry_name($zip_entry));
			if ($dir_name != ".") {
				$dir_op = getcwd(). "\\$file/";
				foreach ( explode("/", $dir_name) as $k) {
					$dir_op = $dir_op . $k;
					if (is_file($dir_op)) unlink($dir_op);
					if (!is_dir($dir_op)) mkdir($dir_op);
					$dir_op = $dir_op . "/";
				}
			}
			$fp = fopen(basename($file, ".zip")."/" .zip_entry_name($zip_entry), "w");
			fwrite($fp, $buf);
			zip_entry_close($zip_entry);
		} else
		return false;
	}
	zip_close($zip);
} else
return false;
}

//modo de usar:
unzip("file.zip");
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, legal, mas eu fiz alguns testes e achei um erro, quando o arquivo zip contém subpastas, e a partir do dir do zip ele fica com o dir como por exemplo pasta1/pasta2/pasta3, ele tenta criar um arquivo com nome pasta3, isso ocorre pq você pega somente o diretório onde essa pasta se encontra com o dirname(). Vou tentar consertar, depois eu posto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Finalmente terminei, tava quebrando a cabeça pra descobrir o que era uma pasta e o que era um arquivo dentro do zip, as funções is_dir e is_file só dão TRUE se a pasta (ou arquivo) existirem. Então descobri uma coisa meio óbvia e usei. Quando é uma pasta, o zip_entry_read() retorna false, simples assim. O resto que eu mudei é fácil de entender a lógica. Pelo menos no que eu testei aqui funcionou. Aí está:

 

function unzip($file){	if(pathinfo($file, PATHINFO_EXTENSION) != "zip") {		return false;	}	if ($zip = zip_open(getcwd(). "\\".$file)) {		if(!file_exists($basename=basename($file, ".zip"))) {			mkdir($basename);		}		while ($zip_entry = zip_read($zip)) {			if (zip_entry_open($zip, $zip_entry, "r")) {				$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));				$dir_name = zip_entry_name($zip_entry);				$isdir = !$buf;				if ($isdir && !is_dir($dir_name)) {				   mkdir($basename."\\".$dir_name);				   continue;				}				else if (file_exists($dir_name)) unlink ($dir_name);				$fp = fopen($basename."/" .zip_entry_name($zip_entry), "w");				fwrite($fp, $buf);				zip_entry_close($zip_entry);			} else			return false;		}		zip_close($zip);	} else	return false;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alisson apareceu outros erros mas vou ver só o ano que vem agora = )

 

o 1 erro é quando tem uma pasta dentro de outra pasta ele da erro

tipo assim quando foi zipada uma pasta e nao or arquivos

 

2 erro seu script ta apagando o proprio script unzip.php = )

 

bom depois eu vejo com calma t+

 

ah só pra você ver, se você zipar o unzip.php junto quando você rodar o unzip ele apaga o unzip.php que ta rodando tbm = )

 

exemplo file.zip => dentro do file.zip tem uma copia do unzip.php, dai se roda o unzip ele apaga o unzip.php que ta rodando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, o primeiro erro que você falou aqui não deu não, descompactou certinho, mesmo com sub-pastas, sub-sub-pastas, etc.

 

O 2° erro é verdade mesmo hehehe, esqueci de um pequeno detalhe, correção:

 

function unzip($file) {	if(pathinfo($file, PATHINFO_EXTENSION) != "zip") {		return false;	}	if ($zip = zip_open(getcwd(). "\\".$file)) {		if(!file_exists($basename=basename($file, ".zip"))) {			mkdir($basename);		}		while ($zip_entry = zip_read($zip)) {			if (zip_entry_open($zip, $zip_entry, "r")) {				$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));				$dir_name = zip_entry_name($zip_entry);				$isdir = !$buf;				if ($isdir && !is_dir($dir_name)) {				   mkdir($basename."\\".$dir_name);				   continue;				}				else if (file_exists($basename."\\".$dir_name)) unlink ($dir_name);				$fp = fopen($basename."/" .zip_entry_name($zip_entry), "w");				fwrite($fp, $buf);				zip_entry_close($zip_entry);			} else			return false;		}		zip_close($zip);	} else	return false;}

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voltando ao primeiro erro que o Fabyo disse. Quando você compactava uma pasta, com nome "teste" por exemplo", e deixava o arquivo zip com o mesmo nome "teste" ele não criava o diretório. O arquivo zip já cria uma pasta no começo, tentava criar uma pasta com o mesmo nome (a pasta que está dentro do zip) no mesmo dir. Eu estava esquecendo de colocar a url dessa pasta que o zip criava para ser criado a nova pasta dentro desta e não no mesmo diretório. Código corrigido:

 

function unzip($file) {	if(pathinfo($file, PATHINFO_EXTENSION) != "zip") {		return false;	}	if ($zip = zip_open(getcwd(). "\\".$file)) {		if(!file_exists($basename=basename($file, ".zip"))) {			mkdir($basename);		}		while ($zip_entry = zip_read($zip)) {			if (zip_entry_open($zip, $zip_entry, "r")) {				$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));				$dir_name = $basename."\\".zip_entry_name($zip_entry);				$isdir = !$buf;				if ($isdir) {				   mkdir($dir_name);				   continue;				} else if (file_exists($dir_name)) unlink ($dir_name);				$fp = fopen($dir_name, "w");				fwrite($fp, $buf);				zip_entry_close($zip_entry);			} else			return false;		}		zip_close($zip);	} else	return false;}

Se tiver mais algum erro é só falar. :natalwink:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.