PHP不会显示页面和下载

时间:2012-08-10 03:01:13

标签: php

我正在尝试在下载文件之前使用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 个答案:

答案 0 :(得分:1)

内容发送到浏览器后,您无法set header information。如果您实际上正在下载 - 可能会在某个地方进行一些输出缓存。

对于您要完成的内容,您可能希望显示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>

答案 1 :(得分:0)

有一个简单的原则:

  

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

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

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

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

答案 2 :(得分: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指向它。像这样:

的download.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>

答案 3 :(得分: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-equiv中的{p> <meta http-equiv="refresh"表示namevalue 等于属于HTTP标头,因此它与{ {1}}标题。

SourceForge下载任何文件,您将看到JavaScript实施(Refresh:)。