O diretório é algo como:
home/
file1.html
file2.html
Another_Dir/
file8.html
Sub_Dir/
file19.html
Estou usando a mesma classe PHP Zip usada em PHPMyAdmin http://trac.seagullproject.org/browser/branches/0.6-bugfix/lib/other/Zip.php . Não tenho certeza de como compactar um diretório em vez de apenas um arquivo. Aqui está o que tenho até agora:
$aFiles = $this->da->getDirTree($target);
/* $aFiles is something like, path => filetime
Array
(
[home] =>
[home/file1.html] => 1251280379
[home/file2.html] => 1251280377
etc...
)
*/
$zip = & new Zip();
foreach( $aFiles as $fileLocation => $time ){
$file = $target . "/" . $fileLocation;
if ( is_file($file) ){
$buffer = file_get_contents($file);
$zip->addFile($buffer, $fileLocation);
}
}
THEN_SOME_PHP_CLASS::toDownloadData($zip); // this bit works ok
mas quando tento descompactar o arquivo zip baixado correspondente, obtenho "operação não permitida"
Esse erro só acontece quando tento descompactar no meu mac, quando descompacto pela linha de comando o arquivo descompacta ok. Preciso enviar um tipo de conteúdo específico no download, atualmente 'aplicativo / zip'
Respostas:
Aqui está uma função simples que pode compactar qualquer arquivo ou diretório recursivamente, só precisa da extensão zip para ser carregada.
Chame assim:
fonte
file_get_contents
e adicionando strings. o compactado não suporta a adição direta de arquivos?'/'
comDIRECTORY_SEPARATOR
fazê-lo funcionar no Windows, é claro. Caso contrário, você acabará com o caminho completo (incluindo o nome da unidade) em seu ZIP, por exemploC:\Users\...
.//
por,\
pois isso realmente quebra o foreach do Windows. Se você usar o integradoDIRECTORY_SEPARATOR
como deveria, não há necessidade de substituí-lo. A codificação de/
é o que estava causando problemas a alguns usuários. Fiquei um pouco confuso sobre o motivo de estar recebendo um arquivo vazio. Minha revisão funcionará bem em * nix e Windows.Mais um arquivamento de árvore de diretório recursivo, implementado como uma extensão do ZipArchive. Como bônus, uma função auxiliar de compressão de árvore de instrução única está incluída. Localname opcional é suportado, como em outras funções ZipArchive. Erro ao lidar com o código a ser adicionado ...
fonte
Eu editei a resposta de Alix Axel para tomar um terceiro argumento, ao definir este terceiro argumento para
true
todos os arquivos sejam adicionados no diretório principal em vez de diretamente na pasta zip.Se o arquivo zip existir, o arquivo também será excluído.
Exemplo:
Estrutura
true
zip do terceiro argumento :Terceiro argumento
false
ou estrutura zip ausente:Código editado:
fonte
$maindir
para o nome preferido.UTILIZAÇÃO: thisfile.php? Dir =. / Path / to / folder (Após compactar, ele também inicia o download :)
fonte
Tente este link <- MAIS CÓDIGO FONTE AQUI
fonte
Aqui está meu código para compactar as pastas e suas subpastas e seus arquivos e torná-lo disponível para download em formato zip
Se houver algum problema com o código, me avise.
fonte
Eu precisava executar esta função Zip no Mac OSX
então eu sempre fecharia aquele .DS_Store chato.
Eu adaptei https://stackoverflow.com/users/2019515/user2019515 incluindo arquivos adicionaisIgnore.
SO para ignorar o .DS_Store do zip, você executa
zipIt ('/ caminho / para / pasta', '/caminho/para/comprimido.zip', falso, array ('. DS_Store'));
fonte
Ótima solução, mas para meu Windows preciso fazer modificações. Abaixo do código de modificação
fonte
Este código funciona para Windows e Linux.
fonte
Esta é minha versão baseada no Alix's, funciona no Windows e espero que no * nix também:
fonte
Aqui está a função recursiva simples, fácil de ler e que funciona muito bem:
fonte
Após a resposta de @ user2019515, eu precisava lidar com exclusões para meu arquivo. aqui está a função resultante com um exemplo.
Função Zip:
Como usá-lo :
fonte