我整天都在用头撞这个。是时候寻求帮助了。
所以,我有一个 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){ 做标题的东西}
...希望在发送文件之前页面能够正确加载并且每个人都开心。再说一次,唉。它首先提供文件,并且不重新加载页面。
再次,希望我的措辞有意义。
我读过一个 php 脚本会首先“做”标题,所以你把它们放在哪里都没关系。我不知道这是不是真的,但根据我所看到的,它是。
我还尝试在 fclose 之后使用标头重定向到同一页面,并使用简单的 GET 使脚本显示成功消息。但是,如果我这样做,重新加载工作,但不显示下载提示。即使我在重定向到自我之前放了一个 sleep(10) 。它只是等待然后重新加载,但没有文件下载。
页面重新加载非常重要,因为当页面的其余部分重新获取订单数据并显示时,下载尝试次数应该增加 1。
有什么办法可以实现我想要做的事情吗?我正在剪切的代码变得越来越hacky,因此非常感谢任何帮助或建议。