用php强制文件下载使用header()

我希望用户能够下载我的服务器上的一些文件,但是当我尝试使用互联网上的许多这样的例子时,似乎没有任何东西可以用于我。 我试过这样的代码:

<?php $size = filesize("Image.png"); header('Content-Description: File Transfer'); header('Content-Type: image/png'); header('Content-Disposition: attachment; filename="Image.png"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . $size); readfile("Image.png"); 

我甚至试图用我能find的最基本的例子,像这样:

 <?php header('Content-type: image/png'); header('Content-Disposition: attachment; filename="Image.png"'); readfile('Image.png'); 

当我testing了这个,我已经删除了所有其他的代码,并使用一个空的文件,只是这个代码,以消除外部来源创build的任何故障。

当我查看控制台时,文件被发送与正确的头,即

 'Content-Disposition: attachment; filename="Image.png"' 

但是保存对话框不显示。

我也尝试了内联处理,而不是内容处置标题中的附件,但这也没有什么区别,我已经在Firefox 8.0.1 Chrome 15.0.874.121和Safari 5.1.1中testing过了。

我敢肯定你不会在文件下载时将mimetypes添加为JPEG格式:

 header('Content-Type: image/png'); 

这些标题从来没有让我失望:

 $quoted = sprintf('"%s"', addcslashes(basename($file), '"\\')); $size = filesize($file); header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . $quoted); header('Content-Transfer-Encoding: binary'); header('Connection: Keep-Alive'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . $size); 

问题是,我用ajax发送消息到服务器,当我用直接链接下载文件一切工作正常。

我用这个其他的Stackoverflow问答材料,它对我很好:

  • Ajax文件使用Jquery,PHP下载

这对我来说就像下载PNG和PDF的魅力。

 header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.$file_name.'"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file_url)); //Absolute URL ob_clean(); flush(); readfile($file_url); //Absolute URL exit(); 

它为我工作

 $attachment_location = "filePath"; if (file_exists($attachment_location)) { header($_SERVER["SERVER_PROTOCOL"] . " 200 OK"); header("Cache-Control: public"); // needed for internet explorer header("Content-Type: application/zip"); header("Content-Transfer-Encoding: Binary"); header("Content-Length:".filesize($attachment_location)); header("Content-Disposition: attachment; filename=filePath"); readfile($attachment_location); die(); } else { die("Error: File not found."); }