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

时间:2010-11-29 13:23:46

标签: 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
// header('Location:../checkout.php');  Doesn't work
// echo ('<meta http-equiv="refresh" content="1;url=../checkout.php">');  Doesn't work

4 个答案:

答案 0 :(得分:3)

在输出文件后输出标题是不可能的。标题需要先行(因此得名)。如果在输出文件之前输出标题,浏览器可以自由地忽略正文。我不确定实际的浏览器是做什么的,但我怀疑是否会同时启动重定向文件下载。可能会忽略其中一个。

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

为了说明,这将是浏览器收到的内容:

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">

第一个空行后的所有内容都将保存为文件内容,包括<meta>标记。您实际上会通过输出任何其他内容来损坏文件。

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

答案 1 :(得分:1)

我有一个解决方法。我用target="_blank"发送文件的页面,在第一页上我做了一个onclick javascript重定向或显示div。

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

希望这有帮助。

答案 2 :(得分:0)

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

由于浏览器将开始下载,因此不会从显示的页面重定向。

答案 3 :(得分:0)

仅在我进行此操作一分钟时就发布此内容,也试图在用户提交表单后重定向并下载文件。解决方案是在表单处理页面的iframe中嵌入运行readfileDownloader.php的PHP文件,然后在该页面上刷新即可。我的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');