MF
Download de arquivos
Fechado
Ola,
Estou tendo dificuldades para fazer o download de arquivos zip dentro de uma pequena aplicação com o Adianti Framework.
O arquivo que devo fazer o download é algo como: cotacoes/1.zip.
O problema que esta acontecendo é que o arquivo aparece na tela, e nao eh realizado o download.
Segue a rotina que estou usando:
if (file_exists($zip_file)) {
header("Pragma: public");
header("Expires: 0"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
// browser must download file from server instead of cache
// force download dialog
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream", FALSE);
header("Content-Type: application/download", FALSE);
header("Content-Disposition: attachment; filename=".basename($zip_file));
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($zip_file));
readfile($zip_file);
readfile.exit();
} else {
new TMessage('info', "Arquivo com cotações não localizado em nosso servidor.");
exit();
}
}
Quando uso a mesma rotina de download num arquivo php fora do Framework, o download é realizado com sucesso.
Quando tento fazer o download dentro da aplicação, o arquivo é visualizado na tela e não é feito o download. Preciso fazer o download.
Ja li alguns posts sobre download e upload aqui no forum, inclusive ate uma sugestao de modificação no arquivo nativo download.php no raiz do framework.
Alguem teria alguma sugestao?
Obrigado.
Estou tendo dificuldades para fazer o download de arquivos zip dentro de uma pequena aplicação com o Adianti Framework.
O arquivo que devo fazer o download é algo como: cotacoes/1.zip.
O problema que esta acontecendo é que o arquivo aparece na tela, e nao eh realizado o download.
Segue a rotina que estou usando:
if (file_exists($zip_file)) {
header("Pragma: public");
header("Expires: 0"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
// browser must download file from server instead of cache
// force download dialog
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream", FALSE);
header("Content-Type: application/download", FALSE);
header("Content-Disposition: attachment; filename=".basename($zip_file));
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($zip_file));
readfile($zip_file);
readfile.exit();
} else {
new TMessage('info', "Arquivo com cotações não localizado em nosso servidor.");
exit();
}
}
Quando uso a mesma rotina de download num arquivo php fora do Framework, o download é realizado com sucesso.
Quando tento fazer o download dentro da aplicação, o arquivo é visualizado na tela e não é feito o download. Preciso fazer o download.
Ja li alguns posts sobre download e upload aqui no forum, inclusive ate uma sugestao de modificação no arquivo nativo download.php no raiz do framework.
Alguem teria alguma sugestao?
Obrigado.
Marcelo, acho que seu problema é o nome do arquivo, já que '/' é um caractere inválido. Experimente trocá-lo por um '_', por exemplo!
João,
Obrigado por sua resposta, mas na verdade esse não é o problema. O nome do arquivo é apenas 1.zip, dentro da pasta cotacoes/ . Assim antes de passar o parametro o nome completo junto o path + nome do arquivo => cotacoes / 1.zip
A aplicação está encontrando o arquivo corretamente, ou seja, não apresenta nenhum erro quanto a nome inválido ou arquivo não encontrado.
A questão é que o arquivo, ao inves de ser baixado diretamente pelo browser (download do arquivo) está sendo visualizado na tela, ou seja, seu conteudo é mostrado na tela.
De qualquer forma, obrigado pela força.
Aqui uso assim:
TPage::openFile('app/output/1.zip');
Entendi!!!
O seu problema é o browse. Se for o Firefox, vá No menu Opções / Aplicativos, na lista que abre procure pela extensão ZIP (geralmente há um aplicativo associado, tipo WinRAR archive) e troque a AÇÃO para perguntar ou Download. Nos outros browsers a solução é semelhante.
Felipe Cortez, obrigado por sua dica. Ela me ajudou na solução do problema. De fato, agora ja esta fazendo o download do arquivo zip da forma como eu preciso.
Porem, se eu uso só o readFile ele nao baixa o arquivo e so mostra na tela (so caracteres malucos, porque o arquivo é zipado).
Se eu uso so o openFile ele nao faz nada, nem baixa o arquivo nem mostra na tela.
Se eu uso o openFile seguido do readFile ele faz os dois, ou seja, faz o download corretamente e depois visualiza na tela (lembrando que eu nao quero mostrar na tela, so fazer o download).
Entao, agora tá assim, ta funcionando porque tá fazendo o download corretamente, porem, ta mostrando na tela um monte de sujeira tambem.
Joao Leonel Ferreira, obrigado por sua dica, tambem me ajudou a entender melhor o problema.
Obrigado a todos.
Abaixo, deixo o codigo ai pra quem quiser dar uma olhada. Ta funcionando...
public function onBaixar( $param )
{
$zip_file = $param['id'] . '.zip';
$path = 'cotacoes/';
if (file_exists($path . $zip_file))
{
header("Pragma: public");
header("Expires: 0"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".basename($path . $zip_file));
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($path . $zip_file));
ob_end_clean();
flush();
TPage::openFile($path . $zip_file);
readfile($path . $zip_file);
} else
{
new TMessage('info', "Arquivo com cotações não localizado em nosso servidor.");
}
}
Pessoal,
Usem do jeito mais fácil, please:
Não é necessário um monte de código ;-)
Só habilitem a extensão ZIP no download.php, que por default é desabilitada.
Att,
Mais chamaria este código TPage::openFile('app/output/1.zip'); por uma função?