2010-09-07 143 views
0

我目前正在构建一个脚本,允许用户通过URL下载文件,而不会真正看到文件名或文件的存储位置。到目前为止,我已经建立了一切,但我需要知道如何去调用文件来打开和下载。我目前有一个工作版本(下面的代码),但由于某种原因,PHP正在破坏下载。每次我尝试打开一个下载到桌面的文件时,我都会收到一条损坏的错误消息。当我在服务器上打开相同的文件时,该文件工作得很好。PHP文件下载

URL结构:发起下载

$fullpath = BASE_PATH . '../uploads/brochures/' . $vendors['0']['filename']; 

    header("Content-type: application/pdf"); 
    header('Content-disposition: attachment; filename="' . $fullpath . '"'); 

我做得不对,将导致文件被损坏
http://www.example.com/download/file/cjVQv0ng0zr2

码?我错过了一个或两个头?

由于提前, 杰克

回答

2

你需要调用下面的行发送的报头之后。

readfile($fullpath); 

,并调整在标题是这样的:

header('Content-disposition: attachment; filename="' . basename($fullpath) . '"'); 

有一件事我不知道大约是$ FULLPATH ..尝试,看看你有$ FULLPATH是正确的,你可以实际上到达文件,这需要是文件的完整物理路径。

我认为这也将是一个好主意,添加下列头以及:

header("Content-Transfer-Encoding: binary"); 
+0

感谢您回应这么快。我已经改变了脚本以包含您提到的内容,但仍然收到以下错误:打开此文档时发生错误。该文件已损坏,无法修复。 – Jake 2010-09-07 22:22:26

+0

只是为了确保你的物理路径是正确的,只是绕在代码里面if(is_file($ fullpath)){} – 2010-09-07 22:24:05

+0

我明白你对文件路径的看法,我会检查并确认,但是我上次检查,我相信这是正确的。 – Jake 2010-09-07 22:24:35

0

我有一个类似的问题而回。确保您的脚本文件中没有任何额外的空格,可以在"<?php"标记之前或"?>"标记之后。在我的情况下,我的脚本的最后一个字符是"\n",而不是预期的">"

0

我曾经遇到同样的问题,以下为我工作;放

while(@ob_end_clean()); 

之前报头的功能:

header("Content-Type: ". $row['p_mime']); 
header("Content-Length: ". $row['p_size']); 
header("Content-Disposition: inline; filename=".$row["p_name"]); 

内容处置:附接/内联已经根据例(1.提示下载/ 2。在浏览器中打开)

被设置

注意:注意在报头函数之前没有回显和值,并且谨慎小心不会造成任何伤害,在你认为会失败的报头函数之前将所有函数无声地排除,或产生以“@”开头的警告消息符号到那些php代码行。

所有最好:)

+0

有人!照亮我!为什么我被低估了? – 2010-09-07 23:18:29

+0

刚试过这个解决方案,它对我来说非常合适。谢谢。 – DaveE 2011-03-26 14:54:10

0

确保您退出...

(我使用BLOB)

header("Content-Type: " . $response['content_type']); 
header("Cache-Control: maxage=1"); 
header("Pragma: public"); //fixes ie bug 
echo trim($_data); 
exit();