自动化-如何在PHP中自动开始下载?

您需要在PHP中添加什么代码,才能在访问链接时自动使浏览器将文件下载到本地计算机?

我专门考虑的功能类似于下载站点,它们会在用户单击软件名称时提示用户将文件保存到磁盘上?

kaybenleroll asked 2020-02-13T04:10:28Z
4个解决方案
56 votes

在输出文件之前发送以下标头:

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

@grom:对“应用程序/八位字节流” MIME类型感兴趣。 我不知道,一直只使用'application / force-download':)

Robert Swisher answered 2020-02-13T04:10:47Z
41 votes

这是发送回pdf的示例。

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

@Swish我没有发现应用程序/强制下载内容类型可以做任何不同的事情(在IE和Firefox中进行了测试)。 是否有没有不发回实际MIME类型的原因?

同样在PHP手册中的Hayley Watson发表:

如果您希望强制文件的下载和保存而不是渲染,请记住没有MIME类型为“ application / force-download”。 在这种情况下使用的正确类型是“ application / octet-stream”,而使用其他任何方法仅依赖于以下事实:客户端应该忽略无法识别的MIME类型,而改用“ application / octet-stream”(请参阅: RFC 2046的4.1.4和4.5.1)。

另外,根据IANA,没有注册的应用程序/强制下载类型。

grom answered 2020-02-13T04:11:25Z
10 votes

一个干净的例子。

<?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);
?>
vdbuilder answered 2020-02-13T04:11:45Z
0 votes

我的代码适用于txt,doc,docx,pdf,ppt,pptx,jpg,png,zip扩展名,我认为最好显式使用实际的MIME类型。

$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);
Omidoo answered 2020-02-13T04:12:05Z
translate from https://stackoverflow.com:/questions/40943/how-to-automatically-start-a-download-in-php