我正在尝试在下载文件之前使用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页面。但是,如果我删除了下载,则会显示该页面。
答案 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"
表示name
和value
等于属于HTTP标头,因此它与{ {1}}标题。
从SourceForge下载任何文件,您将看到JavaScript实施(Refresh:
)。