2008-09-03 51 views
40

您需要在PHP中添加哪些代码才能自动让浏览器在访问链接时将文件下载到本地计算机?如何在PHP中自动启动下载?

我特意想到的功能与下载网站的功能类似,只要点击软件名称,提示用户将文件保存到磁盘上?

回答

48

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

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

@grom:有趣的关于 '应用/八位字节流' MIME类型。我没有意识到这一点,总是只使用'应用程序/强制下载':)

36

以下是发回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/octet-stream”,而使用其他任何东西都仅仅依赖于客户端应该忽略无法识别的MIME类型并使用“application/octet-stream”来替代(参考:Sections RFC 2046的4.1.4和4.5.1)。

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

+1

它可以在PC上运行,但是......当我访问Android设备上的下载页面时,“无法下载。不支持的内容”。为什么? – Emerald214 2012-07-12 09:42:17

+1

@ Emerald214没有PDF阅读器。或者没有关于PDF内容类型的关联 – grom 2012-07-13 06:38:40

+0

特别是如果目标文件类型是.zip,并且您在页面上执行的所有操作都是通过PHP启动文件下载,则可能需要添加```ob_clean();` ``和```ob_flush();```在上面的答案中提供的代码之前;当试图在Windows中本地打开.zip时,我遇到了一个问题,即以这种方式获取的操作系统报告的.zip-archives无效,即使7zip和其他专用的压缩归档格式处理工具也可以应对它们。 – SeldomNeedy 2015-07-09 22:41:00

7

一个干净的例子。

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

我的代码适用于TXT,DOC,DOCX,PDF,PPT,PPTX,JPG,PNG,压缩扩展和我认为它能够更好地明确地使用实际的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); 
相关问题