Php 是否可以在readfile()之后重定向页面?

Php 是否可以在readfile()之后重定向页面?,php,Php,是否可以在readfile()之后重定向页面 我试着使用Header,但不起作用。此外,元重定向也不起作用: header ("Content-Type: application/pdf"); header("Content-Disposition: attachment; filename=$file"); header("Content-Length: $size"); readfile($file_path); // Giving file to the customer // he

是否可以在readfile()之后重定向页面

我试着使用Header,但不起作用。此外,元重定向也不起作用:

header ("Content-Type: application/pdf");

header("Content-Disposition: attachment; filename=$file");
header("Content-Length: $size");

readfile($file_path);  // Giving file to the customer
// header('Location:../checkout.php');  Doesn't work
// echo ('<meta http-equiv="refresh" content="1;url=../checkout.php">');  Doesn't work
标题(“内容类型:application/pdf”);
标题(“内容处置:附件;文件名=$file”);
标题(“内容长度:$size”);
readfile($file_path);//将文件交给客户
//标题('Location:../checkout.php');不起作用
//回声(“”);不起作用

输出文件后,无法输出标题。头文件需要放在第一位(因此得名)。如果在输出文件之前输出标题,浏览器可以自由忽略正文。我不确定浏览器到底在做什么,但我怀疑重定向和文件下载是否会同时启动。其中一个可能会被忽略

基本事实:除了文件下载所需的信息外,您不能在与文件下载相同的响应中输出任何信息。文件下载响应的标题只能包含有关文件的信息,响应正文只能包含文件(即,无
刷新等,这些将成为文件的一部分)

举例来说,这就是浏览器接收到的内容:

HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename=foo
Content-Length: 42

woieufhm23umh29… (file contents as binary gibberish) …cQ3985fno1rHtn3f
qo8923r10d30<meta http-equiv="refresh" content="1;url=../checkout.php">
HTTP/1.1200正常
内容类型:application/pdf
内容处置:附件;filename=foo
内容长度:42
woieufhm23umh29…(文件内容为二进制乱码)…cQ3985fno1rHtn3f
qo8923r10d30
第一个空行之后的所有内容都将保存为文件内容,包括
标记。实际上,如果在那里输出任何附加内容,就会损坏文件


通常的工作方式是向用户提供一个“下载页面”,该页面具有自动刷新元标记和/或Javascript,它首先启动下载,然后在第二次刷新时重定向。

您的代码立即将文件内容发送给用户,即开始下载。 如果要开始下载并显示另一个页面,请显示该页面,然后在此页面上发送此标题:
header('Refresh:2;url=url/to/your/download')


由于浏览器将启动下载,因此不会重定向到显示的页面。

我有一个解决方法。在发送我用
target=“\u blank”
打开的文件的页面上,我在第一页上单击了
onclick
JavaScript重定向或show div

打开以发送文件、开始下载并立即关闭的页面


希望这能有所帮助。

我刚刚发布了这篇文章,因为我也花了一分钟的时间在用户提交表单后尝试重定向和下载文件。解决方案是将运行readfileDownloader.PHP的PHP文件嵌入表单处理页面上的iframe中,然后在该页面上刷新即可。My readfileDownloader.php使用application/octet stream来避免iFrame可能试图实际显示目标文件

    // iFrame to load the file downloader php file
    echo '<iframe id="my_iframe" style="display:none;"></iframe>';
    echo '<script>';
    echo "document.getElementById('my_iframe').src = \"readfileDownloader.php\";";
    echo '</script>';

    // Redirects. Refresh must at least be 1.
    header('Refresh: 1;url=final_location.html');
//iFrame加载文件下载程序php文件
回声';
回声';
echo“document.getElementById('my_iframe').src=\“readfileDownloader.php\”;
回声';
//重定向。刷新必须至少为1。
标题('Refresh:1;url=final_location.html');

您是否可以发布一些示例代码,因为您可能使用了不正确的标题?谢谢当它说“将文件提供给客户”时,您在做什么?您正在开始下载吗?您面临的错误消息是什么?听起来应该有“无法设置标题信息,标题已发送…”(这应该是不言自明的)将文件发送给客户开始文件下载,但是,在这之后,我想重定向页面。刷新头也可以通过PHP发送-不需要那些丑陋的meta http equiv标记,因为发送实际的http头并不容易。另外,检查这个问题-@小偷当然,但很难发送文件下载重定向和重定向到下一页。然后你就找到了OP的问题。在我看来,这些下载后重定向页面已经完全过时,元标记刷新是次要的。谢谢你的回复,但我只是想知道如何使用第二次刷新来开始下载,比如说我先让用户进入重定向页面,那么如何刷新页面以开始下载。@amir您可以在服务器上跟踪文件是否已下载。如果是,则重定向,而不是提供文件。不过,使用Javascript可能更容易。因为这两种方法都不是100%可靠的,所以您实际上不应该依赖此功能始终工作,事实上,正如我上面所说的,在IMO中,您应该停止使用下载重定向模式。