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.

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top