Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Alguém sabe me dizer como que eu faço para o PHP solicitar um download automaticamente dentro de um loop? tentei usar o header() juntamente com o readfile() porém não estou conseguindo pois o 1ª download trava o loop. (algo como aqueles gerenciadores de download do MEGA ou se possível zippar e baixar)
Vlw robson o/
Só que me veio outra duvida, como eu faço por exemplo para adicionar um arquivo que esteja armazenado em uma string? (no caso uma imagem que esteja em texto no banco de dados ou vindo de um link externo)
file_get_contents() já é o suficiente? como faço? Tentei aqui mas não funcionou, parece que ele só lê diretórios =/
@EDIT
Consegui resolver, vou deixar aqui abaixo para quem quiser consultar
<?php
//cria a função ziparchive().
$zip = new ziparchive();
//Caso o arquivo exista somente o acessa, caso não exista cria o arquivo
if(file_exists('./zipfile.zip')) {
$zip->open('./zipfile.zip');
} else {
$zip->open('./zipfile.zip', ziparchive::CREATE);
}
//Se o arquivo estiver no diretório ou computador...
$zip->addFile('./img.jpg', $newName);
//se o arquivo estiver contido em uma string...
$img = file_get_contents('https://...');
$zip->addFromString('imagem.jpg',$img);
//fecha a solicitação '$zip->open'
$zip->close();
//caso queira enviar uma solicitação de download ao cliente, checa se o arquivo foi criado e faz download
//NOTA: as vezes dependendo do tamanho do arquivo, pode demorar ao mesmo concluir e o criar
//NOTA2: unlink() exclui o arquivo criado do servidor
if(file_exists('./zipfile.zip')){
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="zipfile.zip"');
readfile('./zipfile.zip');
unlink('./zipfile.zip');
}Apareceu um novo problema kk'
o ziparchive() retornou um erro quando o tamanho do arquivo passou de 256MB, tem como converter ele para algo como ziparchive64()? To pesquisando porém não encontro nada a respeito... falam que o limite vai até 4GB mas não sei como fazer isso...
@EDIT
eu descobri oque era, na verdade era a memória que ficou cheia pelo uso do addFromString()
>
Citar
Caso você ainda queira usar o PHP ZipArchive , existem algumas coisas que você pode fazer para evitar certas limitações do servidor / sistema operacional:
-
Memória Embora possa parecer óbvio no seu caso, tenho visto muitos exemplos de como usar o ZipArchive que usam addFromString para adicionar um novo arquivo ao arquivo. NÃO! Isso irá alocar memória para abrir o arquivo e armazenar seu conteúdo nele, o que fará com que você fique sem memória rapidamente, use addFile . Certifique-se também de liberar toda a memória de que não precisa.
-
Tempo de execução Aumenta o tempo máximo de execução do seu script, seja pelo php.ini ou com ini_set (por exemplo, ini_set('max_execution_time', 600);para ter um tempo máximo de execução de 10min)
-
Identificadores de arquivos Alguns sistemas operacionais têm limites quanto ao número de arquivos abertos que podem causar problemas, pois o PHP só adiciona os arquivos ao arquivo zip depois de fechar o arquivo zip. Para evitar problemas com o número de arquivos abertos basta fechar e reabrir o arquivo zip a cada arquivo x (por exemplo, a cada 1000), isso forçará o PHP a compactar e adicionar os arquivos já atribuídos ao arquivo.
-
Tamanho do arquivo Pode haver algumas limitações de tamanho de arquivo do sistema operacional, um arquivo maior também significa que o PHP precisa de mais memória para gerenciá-lo, então eu pessoalmente prefiro usar um tamanho de arquivo máximo após o qual eu apenas abro um novo arquivo zip usando um número de índice . Se o tamanho exato do arquivo não é importante para você, você pode apenas contar o tamanho dos arquivos que vão para o arquivo e depois mudar depois de atingir um certo limite, ou você pode fechar o arquivo todos os arquivos x e verificar seu tamanho no disco para decida se deseja iniciar um novo arquivo ou não (lembre-se, os arquivos só são compactados depois de fechar o arquivo)
Eu pessoalmente gosto de limitar o tamanho do arquivo colocando o tamanho dos arquivos no arquivo e aplicando um fator de compressão provável para ver quando o tamanho máximo do arquivo provavelmente será atingido (arquivos jpg ~ 0.9, arquivos zip = 1, arquivos de texto ~ 0.10, ...) e, em seguida, mude para o próximo volume.
Referência: StackOverflow
Download dentro de loop não vai funcionar. Você deve usar a opção de zippar e baixar tudo no final.
Segue trecho do meu código para fazer download em zip de uma pasta (na qual deve gravar os arquivos antes).
Está dentro de classe, é só tirar os private e os $this-> se não usar classes no seu código.
//PASSE O CAMINHO DA PASTA COM OS ARQUIVOS E O CAMINHO DO ZIP A SER CRIADO.