我知道这个问题以前已经被问过很多次了,但我找不到适合我需要的答案。
我需要找到一种方法来强制下载文件,然后在下载开始后重定向到“感谢下载”页面。
到目前为止我有:
<?php
ob_start();
$token = $_POST['validationCode'];
if(isset($token)){
$connect = mysql_connect('localhost', 'root', 'root');
$db = mysql_select_db('mydb');
if (!$connect || !$db){
die('Connect Error (' . mysql_connect_errno() . ') '
. mysql_connect_error());
}
$sql = mysql_query("SELECT * FROM emailaddresses WHERE token='$token'");
$result = mysql_fetch_array($sql);
if($result){
header('Location: complete.php');
header('Content-type: application/mp3');
header('Content-Disposition: attachment; filename=track.mp3');
$f = file_get_contents('downloads/track.mp3');
print $f;
$sql = "UPDATE emailaddresses SET download=1 WHERE token='$token'";
$result = mysql_query($sql);
}
else{
echo "There was a problem downloading the file" . mysql_error();
}
}
ob_end_flush();
?>
隐藏下载文件的位置很重要,否则我就会创建一个指向该文件的 HTML 链接。
显然我不能将重定向标头放在其他标头下方,因为它不起作用。除了在弹出窗口中打开它并将主窗口定向到“谢谢”页面之外,我真的不知道从这里该去哪里 - 但这是最后的手段。
有人可以提出任何建议吗?
Cheers,
Rich
- 你不能hide文件位置。任何有决心找到它的人都可以清楚地看到它,因为浏览器需要知道下载文件的 URL。
- 正如您所说,您不能连续使用两个标头重定向来做到这一点。您只能在超时后使用 Javascript 重定向到不同的页面。
确实没有太多选择。如果您的主要目标是隐藏 URL,那么无论如何这都是失败的。为了获得良好的可用性,您通常通常在页面上包含纯链接(“下载未开始?单击here..."),因为用户可能会在错误的时间意外取消重定向,从而不可挽回地终止下载。
您不能在同一请求/响应中输出文件本身以外的任何内容。您可以按照@netcoder的建议尝试多部分HTTP响应,但我不太确定它的支持程度。首先假设有一个“浪费”的请求/响应,其中仅下载了文件,没有发生任何其他事情。处理这种限制的方式通常是这样的:
- 用户单击“下载”链接或使用其电子邮件地址或启动下载过程所需的任何内容提交表格。
- 服务器返回“感谢您从我们这里下载!您的下载很快就会开始......” page.
- 该页面包含 Javascript 或
<meta>
刷新或 HTTPRefresh
导致的标头delayed重定向到文件的 URL。
- The “谢谢”页面将“重定向”到文件位置,但由于这会导致文件下载,因此页面不会明显更改,只会启动下载。
Look at http://download.com http://download.com举个实际例子。
您可以将文件的下载位置设置为仅在允许用户下载文件时才返回文件的脚本。您可以在之间传递一些临时令牌“谢谢”页面和文件下载页面来验证是否允许下载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)