1

我正在尝试在下载文件之前使用 PHP 显示 HTML 页面。我了解我无法重定向到其他页面并同时下载文件,但为什么这不起作用?

echo "<html>...Example web page...</html>";

$download = '../example.zip'; //this is a protected file

header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename=example.zip');
readfile($download);

文件下载,但它从不显示回显的 HTML 页面。但是如果我删除下载,页面就会显示。

4

4 回答 4

1

内容发送到浏览器后,您无法设置标题信息。如果您实际上正在下载 - 某处可能有一些输出缓存。

对于您要完成的工作,您可能希望显示 HTML 内容,并使用<meta>标签或 JavaScript 重定向到下载脚本。我相信大多数浏览器都会开始下载,同时保持最后加载的页面对用户可见(这应该是你想要做的)。

<meta http-equiv="refresh" content="1;URL='http://example.com/download.php'">

或者:

<script type="text/javascript">
  window.location = "http://example.com/download.php"
</script>
于 2012-08-10T03:06:12.873 回答
0

有一个简单的原则:

请记住,必须在发送任何实际输出之前调用 header(),无论是通过普通 HTML 标记、文件中的空白行还是从 PHP 发送。

解决方案是准备两个页面,一个用于显示html内容,一个用于下载。

在第 1 页中,使用 javascript 设置了一个计时器,以在几次后重定向到下载链接。

例如,“5 秒后,将开始下载”。.

于 2012-08-10T03:03:58.237 回答
0

因为在推出自定义标头之前您无法输出任何内容,我建议使用 JS 重定向到下载,这通常使您保持在同一页面上(只要您只是处理 zip 内容而不是其他内容)。

所以,试试这个:

$download = 'example.zip';

echo '<head> <script type="text/javascript"> function doRedirect(){window.location = "'.$download.'"}</script>

</head><html><script type="text/javascript"> doRedirect() </script> <...Example web page...</html>';

或者,如果您需要一个计时器:

echo '<head> <script type="text/javascript"> function doRedirect(){window.location = "'.$download.'"}</script>

</head><html><script type="text/javascript"> 
setTimeout(doRedirect(),1000);//wait one second</script> <...Example web page...</html>';

编辑:

如果要隐藏文件路径,我建议制作一个下载脚本,JS 将重定向到该脚本。

所以基本上,做你正在做的事情,然后使用 JS 指向它。像这样:

下载.php:

//use an ID or something that links to the file and get it using the GET method (url params)

    $downloadID = $_GET['id'];

    //work out the download path from the ID here and put it in $download
if ( $downloadID === 662 )
{
    $download = 'example.zip';//...
 }   
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename=$download');
    readfile($download);

然后在您的主 HTML 文件中,使用 JS 以正确的 ID 指向它:

<head> <script type="text/javascript"> function doRedirect(){window.location = "Download.php?id=662"}</script>

</head><html><script type="text/javascript"> doRedirect() </script> <...Example web page...</html>
于 2012-08-10T03:14:59.603 回答
0

如前所述,您无法在输出已发送后发送标头。

所以,这可能对你有用:

header('Refresh: 5;URL="http://example.com/download.php"');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename=example.zip');
readfile($download);

http-equivin<meta http-equiv="refresh"表示nameand等价于 HTTP 标头,因此它对标头执行相同的value操作。Refresh:

从SourceForge下载任何文件,您将看到一个 JavaScript 实现 ( Your download will start in 5 seconds...)。

于 2012-08-10T03:15:28.717 回答