PHP标题混乱

时间:2011-11-21 12:09:04

标签: php header fclose

我整天都在反对这一个。是时候寻求帮助了。

所以,我有一个PHP脚本,这是一个下载页面。用户可以根据他们订购的内容下载文件。

它是这样的(显然不是真正的代码,有些是 - 希望你能得到要点)

PAGE START
if(post[getorder]){

check order exists, get order filename etc from mysql;
update download attempts in db;

$ctype="application/force-download";
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
$handle = fopen($filename, "r");
while ( $contents = fread( $handle, 1024 ) )
{
print (  $contents );
flush();
}
fclose($handle);    
$successmessage = "Your download has begun";                  
}

if($successmessage){
 echo $successmessage;
}

get users order details from db;
display div
 display form with post to post order number to script; 
 end form
end div
END PAGE

希望这是有道理的。我可以把所有代码放在更有用的地方,但这是一个很长的旧脚本,我认为这可能更方便。

因此,如果用户只是在查看该页面,那么该脚本会抓取用户关于他们可能拥有的任何订单的订单信息。用户只有在订单标记为完成且不再可用之前才会尝试下载X.

它显示每个可用订单的div,并且每个div内部都是一个小形式。如果他们点击表单,它会将订单号发回给同一个脚本,此时我希望它只是提供文件,然后继续显示页面的其余部分。唉没有,显然强制下载的标题抓住控制并且在fclose之后没有任何反应。

所以我想到了它,并在$ sendfile = 1的行中添加了一个变量到“if(post ...)”,并且在页面底部...

if($ sendfile == 1){do headers stuff}

...希望在发送文件之前页面会正确加载,大家都很高兴。再说一遍,唉没有。它首先提供文件,不会重新加载页面。

再次,希望我的措辞有道理。

我已经读过PHP脚本会首先“执行”标题,所以无论你把它放在哪里都没关系。我不知道这是否属实,但基于我所看到的,它是。

我还尝试在fclose之后使用标头重定向到同一页面,并使用简单的GET使脚本显示成功消息。但是,如果我这样做,重新加载工作,但下载提示不会显示。即使我在重定向到自我之前就睡了(10)。它只是等待然后重新加载,但没有文件下载。

页面重新加载非常重要,因为当页面的其余部分重新获取订单数据并显示它时,下载尝试应该增加1.

有没有办法实现我想做的事情?我正在削减的代码变得越来越黑,所以任何帮助或建议将非常感激。

1 个答案:

答案 0 :(得分:1)

在下载登录页面上,尝试添加<meta http-equiv="refresh" content="1; url=/download/file/url">而不是使用标头。这将使浏览器加载页面,然后在1秒后重定向到文件下载。

此外,如果您提供的不是小文件,我建议您查看X-Sendfile