用PHP强制下载然后重定向

Ric*_*AHB 4 php redirect header download hide

我知道这个问题以前曾被问过多次,但我找不到符合我需要的答案.

我需要找到一种强制下载文件的方法,然后在下载开始后,重定向到"感谢下载"页面.

到目前为止,我有:

<?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();

?>
Run Code Online (Sandbox Code Playgroud)

隐藏下载文件的位置很重要,否则我就会创建一个指向该文件的HTML链接.

我显然不能将重定向标题放在其他标题下面,因为它不起作用.除了在弹出窗口中打开它并将主窗口指向"谢谢"页面之外,我无法真正看到从这里开始的地方 - 但这是一个最后的度假胜地.

谁能提出任何建议?

干杯,

丰富

dec*_*eze 5

  1. 您无法隐藏文件位置.由于浏览器需要知道下载文件的URL的必要性,任何确定足以找到它的人都可以清楚地看到它.
  2. 正如你所说,你不能连续两个标题重定向.您只能在使用Javascript超时后重定向到其他页面.

真的没有太多选择.如果您的主要目标是隐藏URL,那么无论如何这都是失败的原因.为了获得良好的可用性,您通常会在页面上包含纯链接("下载无法启动?单击此处 ..."),因为用户可能会在错误的时间意外取消重定向,从而不可挽回地终止下载.


您不能在同一请求/响应中输出除文件本身之外的任何内容.您可以尝试@netcoder建议的多部分HTTP响应,但我不确定它的支持程度如何.首先假设有一个"浪费"的请求/响应,其中只下载文件而没有其他任何事情发生.通常使用此限制的方式如下:

  • 用户点击"下载"链接或使用他的电子邮件地址或启动下载过程所需的任何内容提交表单.
  • 服务器返回"感谢您从我们这里下载!您的下载将很快开始......"页面.
  • 此页面包含Javascript或<meta>刷新或HTTP Refresh标头,导致延迟重定向到文件的URL.
  • "谢谢"页面将"重定向"文件位置,但因为这会导致要下载的文件,页面将不会发生明显变化,仅下载将被启动.

请查看http://download.com以获取此操作的示例.

您可以将文件的下载位置设置为仅在允许用户下载文件时才返回文件的脚本.您可以在"谢谢"页面和文件下载页面之间传递一些临时令牌,以验证是否允许下载.