PHP Headers confusion


PHP Headers confusion

我一整天都在想这件事。是时候寻求帮助了。

我有一个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之后什么也没有发生。

所以我想管它,并添加了一个变量到"if(post…)"沿着$sendfile = 1的行,并在页面的底部…

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

…希望页面能够在发送文件之前正确加载,每个人都很高兴。唉,还是不行。它首先提供文件,而不重新加载页面。

再一次,希望我的措辞是有意义的。

我读到一个php脚本会"做"头,所以不管你把它们放在哪里。我不知道那是不是真的,但是根据我所看到的,它是真的。

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

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

有什么方法可以达到我想要做的吗?我正在削减的代码是越来越多的黑客,所以任何帮助或建议将非常感激。

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

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