是否可以在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
答案 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');