Como iniciar um download automaticamente em PHP?
-
09-06-2019 - |
Pergunta
Qual código você precisa adicionar em PHP para que o navegador baixe automaticamente um arquivo para a máquina local quando um link for visitado?
Estou pensando especificamente em funcionalidades semelhantes às dos sites de download que solicitam ao usuário que salve um arquivo no disco ao clicar no nome do software.
Solução
Envie os seguintes cabeçalhos antes de gerar o arquivo:
header("Content-Disposition: attachment; filename=\"" . basename($File) . "\"");
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($File));
header("Connection: close");
@grom:Interessante sobre o tipo MIME 'application/octet-stream'.Eu não sabia disso, sempre usei apenas 'application/force-download' :)
Outras dicas
Aqui está um exemplo de envio de um PDF.
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);
@Swish Não encontrei o tipo de conteúdo aplicativo/download forçado para fazer algo diferente (testado no IE e no Firefox).Existe um motivo para não enviar de volta o tipo MIME real?
Também no manual do PHP Hayley Watson postou:
Se você deseja forçar o download e o salvamento de um arquivo, em vez de ser renderizado, lembre-se de que não existe um tipo MIME como "application/force-download".O tipo correto a ser usado nesta situação é "application/octet-stream", e usar qualquer outra coisa é apenas confiar no fato de que os clientes devem ignorar tipos MIME não reconhecidos e usar "application/octet-stream" (referência:Seções 4.1.4 e 4.5.1 da RFC 2046).
Também de acordo IANA não há tipo de aplicativo/download forçado registrado.
Um exemplo limpo.
<?php
header('Content-Type: application/download');
header('Content-Disposition: attachment; filename="example.txt"');
header("Content-Length: " . filesize("example.txt"));
$fp = fopen("example.txt", "r");
fpassthru($fp);
fclose($fp);
?>
meu código funciona para extensões txt,doc,docx,pdf,ppt,pptx,jpg,png,zip e acho melhor usar explicitamente os tipos MIME reais.
$file_name = "a.txt";
// extracting the extension:
$ext = substr($file_name, strpos($file_name,'.')+1);
header('Content-disposition: attachment; filename='.$file_name);
if(strtolower($ext) == "txt")
{
header('Content-type: text/plain'); // works for txt only
}
else
{
header('Content-type: application/'.$ext); // works for all extensions except txt
}
readfile($decrypted_file_path);