2010-07-23 118 views
2
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); 
header("Content-type: application/force-download"); 
header("Content-Disposition: attachment; filename=\"". $file ."\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".filesize($file)); 
file_get_contents($file); 
readfile($file); 
exit(); 

任何想法我做错了什么?不应该将我的服务器上的任何文件下载到用户的硬盘上吗?不知何故每个文件都被损坏了!此外,我不知道如何改变下载文件的文件名?php:强制下载到hd?

$file始终包含我的文件的完整路径。 如果我尝试header('Location:' . $file);浏览器成功打开我的文件。但是,如果该文件是.jpg,则浏览器不会提示下载窗口。相反,它只是在浏览器窗口中打开文件。我希望每个文件都能下载到hd。

请帮帮我吧。我在此之后已经过了一个多星期了,我找不到解决方案?

+0

如果$文件中包含的路径,并不仅名字,你应该使用'文件名= \ “”。 basename($ file)。“\”;“'和什么是'file_get_contents($文件);'行应该这样做? – VolkerK 2010-07-23 00:54:34

回答

4

为什么不使用

header("Content-type: application/octet-stream");

而是 “强制下载”

同样的你为什么要这么做file_get_contentsreadfile?只需要一个 - 你基本上包含了两次文件,这就是它被破坏的原因。这是我怎么会执行上面的代码:

header("Cache-Control: no-cache"); 
header("Expires: -1"); 
header("Content-Type: application/octet-stream;"); 
header("Content-Disposition: attachment; filename=\"" . basename($file) . "\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . filesize($file)); 
echo file_get_contents($file); 

这应该是足够的 - 只要该文件确实存在

+2

我更喜欢''readfile($ file)''over'echo file_get_contents($ file) 。不需要将整个文件内容读入内存(作为一个字符串),然后回显它 – VolkerK 2010-07-23 01:01:15

+0

这是非常真实的。脚本的主要问题是缺少内容处置的基本名称,并且包含两个“文件读取“函数,'readfile'可能更适合 - 我一直使用'file_get_contents' – 2010-07-23 01:07:12