5

我正在使用这个小推送器 php 文件下载一个“exe”文件,供用户在填写表格时保存。

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);

使用这种方法,没有人可以关注的在线 $file 位置的链接,但由于某种原因,我无法在代码执行之后甚至之前显示感谢页面。

我试过 header("Location: $thankyouurl"); 在上面的代码之后立即,但什么都没有显示,我尝试在运行上面的代码之前回显感谢页面的 html 源代码,但这会导致 exe 文件被下载到网页实际上导致浏览器崩溃.

有什么建议么???

4

4 回答 4

15

将用户直接指向显示感谢信息的静态页面。然后,使用 JavaScript 将 设置window.location为您的下载脚本。

如果您的下载页面的标题设置正确,浏览器将开始下载文件,而您的用户正在阅读您的感谢信息。

如果用户禁用了 JavaScript,请确保显示直接下载链接。

例子:

索引.php

<a href="thankyou.php">Click here to download.</a>

谢谢你.php

<html>
<head>
    <script type="text/javascript">
        function startDownload() {
            window.location = "/download.php";
        }
    </script>
</head>
<body onload="startDownload();">
    <h1>Thank you!</h1>
    <p>Your download will start in a moment. If it doesn't, use this <a href="download.php">direct link.</a></p>
</body>

下载.php

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);

更新

为了将数据从index.phpon 传递到下载脚本,您可以使用GET变量。该thankyou.php页面的链接将成为thankyou.php?download=12下载是您获取正确文件的 ID。然后,您可以通过在您的标记中回显该变量,将其传递给您的下载脚本,如下所示:

索引.php

<a href="thankyou.php?download=12">Click here to download.</a>

谢谢你.php

<html>
<head>
    <script type="text/javascript">
        function startDownload() {
            window.location = "/download.php?file=<?=$_GET['download']?>";
        }
    </script>
</head>
<body onload="startDownload();">
    <h1>Thank you!</h1>
    <p>Your download will start in a moment. If it doesn't, use this <a href="download.php?file=<?=$_GET['download']?>">direct link.</a></p>
</body>

然后,您将获取下载脚本中的值并以您喜欢的任何方式处理它。

于 2013-02-04T20:41:32.060 回答
0

不太确定这个,会不会...

header('Location: thanks_page.php');

...不行,。如果放在 readfile() 之后?真的不确定,只是我的想法!

于 2013-02-04T20:45:00.333 回答
0

您可以使用“windows.open('url to download file')”打开“下载页面”

例子:

<script type="text/javascript">
    function openDownload()
    {
        window.open( "http://domain.com/download.php?file=file.pdf" );
        window.location = "http://domain.com/thanks.php";
    }
</script>

打开一个直接下载文件的窗​​口,当您选择保存或取消时,它将自动关闭,然后“父”窗口重定向到感谢页面。

于 2013-02-04T20:47:18.037 回答
0

使用您的原始方法,添加header('location: thank-you-page.php');到末尾,以及退出,如下所示:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);

header('location: thank-you-page.php');
exit;
于 2013-02-04T20:48:02.323 回答