How to Automatically Start a Download in PHP?

2019-01-01 16:10发布

问题:

What code do you need to add in PHP to automatically have the browser download a file to the local machine when a link is visited?

I am specifically thinking of functionality similar to that of download sites that prompt the user to save a file to disk once you click on the name of the software?

回答1:

Send the following headers before outputting the file:

header(\"Content-Disposition: attachment; filename=\\\"\" . basename($File) . \"\\\"\");
header(\"Content-Type: application/force-download\");
header(\"Content-Length: \" . filesize($File));
header(\"Connection: close\");

@grom: Interesting about the \'application/octet-stream\' MIME type. I wasn\'t aware of that, have always just used \'application/force-download\' :)



回答2:

Here is an example of sending back a pdf.

header(\'Content-type: application/pdf\');
header(\'Content-Disposition: attachment; filename=\"\' . basename($filename) . \'\"\');
header(\'Content-Transfer-Encoding: binary\');
readfile($filename);

@Swish I didn\'t find application/force-download content type to do anything different (tested in IE and Firefox). Is there a reason for not sending back the actual MIME type?

Also in the PHP manual Hayley Watson posted:

If you wish to force a file to be downloaded and saved, instead of being rendered, remember that there is no such MIME type as \"application/force-download\". The correct type to use in this situation is \"application/octet-stream\", and using anything else is merely relying on the fact that clients are supposed to ignore unrecognised MIME types and use \"application/octet-stream\" instead (reference: Sections 4.1.4 and 4.5.1 of RFC 2046).

Also according IANA there is no registered application/force-download type.



回答3:

A clean example.

<?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);
?>


回答4:

my code works for txt,doc,docx,pdf,ppt,pptx,jpg,png,zip extensions and I think its better to use the actual MIME types explicitly.

$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);