0

我整天都在用头撞这个。是时候寻求帮助了。

所以,我有一个 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,因此非常感谢任何帮助或建议。

4

1 回答 1

1

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

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

于 2011-11-21T12:21:28.510 回答