php - 使用 PHP 强制下载然后重定向

标签 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();

?>

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

我显然不能将重定向 header 放在其他 header 下方,因为它不会起作用。除了在弹出窗口中打开它并将主窗口定向到“谢谢”页面之外,我真的看不出从这里去哪里 - 但这是最​​后的选择。

谁能给点建议?

干杯,

丰富

最佳答案

  1. 您不能隐藏文件位置。任何有决心找到它的人都可以清楚地看到它,因为浏览器需要知道 URL 才能下载文件。
  2. 如您所说,您不能连续使用两个 header 重定向来做到这一点。您只能在使用 Javascript 超时后重定向到其他页面。

真的没有太多选择。如果您的主要目标是隐藏 URL,那无论如何都是失败的。为了良好的可用性,您通常会在页面上包含普通链接(“下载未开始?单击此处...”),因为用户可能会意外取消在错误的时间重定向以不可撤销地终止下载。


您不能在同一请求/响应中输出文件本身以外的任何内容。您可以按照@netcoder 的建议尝试多部分 HTTP 响应,但我不确定它的支持程度。刚开始时假设有一个“浪费的”请求/响应,其中只下载了文件,没有其他任何事情发生。这种限制通常的工作方式是这样的:

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

http://download.com有关实际操作的示例。

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

关于php - 使用 PHP 强制下载然后重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5574878/

相关文章:

php - linux群发邮件

C++ 从 HTTP 响应中获取图片

php - 使用saveAll时修改Behavior的beforeSave中的Model数据

PHP proc_open() 超时

javascript - 如何使用 url 中的 "#q"重定向 "?q"

c++ - 如何在 C++ 中执行 HTTP 重定向

header - DOS header 中的 e_cblp 和 e_cp 是什么?

php - 下载 mp4 文件的正确 header

php - 电子邮件和密码的 CodeIgniter 验证规则

apache - RewriteRule 删除版本号