PHP头部:Content-disposition: attachment,然后Location:某个URL

4

我的目标是在浏览器下载附件之后将浏览器重定向到新页面。

header("Content-type: text/csv");
header("Cache-Control: no-store, no-cache");
header("Content-disposition: attachment;filename=file.csv");
// csv output logic here

// forward to next page
header("Location: $url");

这是否可能?

更新:上述结果如下:

CSV的最后一行显示PHP错误:

无法修改头信息 - 头信息已经被发送...

这是因为CSV逻辑部分在header("Location: $url");之前修改了内容。

更新:我尝试了一种替代方法:输出一个小的HTML代码块,包含关键行<meta http-equiv="refresh" content="0; url=$url" />(当然,还会输出<html> <head> <body>以及DOCTYPE)。但是,CSV内容仍然显示HTML代码。


你试过了吗?你知道你的目标,你有代码,发生了什么事情? - tradyblix
当然我已经测试过了,出现了“PHP header has already sent”错误。我会尽快更新问题。 - Raptor
@tradyblix问题已更新。谢谢。 - Raptor
2个回答

3
使用当前的代码是不行的。你会强制浏览器将进一步的内容下载到file.csv文件中,因此新的标头被忽略了。
然而,看看meta刷新的东西。您将能够在页面加载之间添加延迟(因此用户实际上可以看到网页),并在刷新中发送文件以进行下载。
为了防止meta标签(和其他HTML)出现在CSV文件内容中,我们可以使用一些$_GET值。
<?php
if (isset($_GET['dl']) && $_GET['dl'] == '1') {
header("Content-type: text/csv");
header("Cache-Control: no-store, no-cache");
header("Content-disposition: attachment;filename=file.csv");
// csv output logic here
}
else{
?>
web page here, with html, head, title, body, and whatnot tags. 
In the head tag, add this:
<meta http-equiv="refresh" content="5;url=http://my.web.site.com/download.php?dl=1"> 
<?php
}
?>

哭泣的婴儿!问题是,元代码也被回显到CSV。 - Raptor

1

你可以在客户端完成:在新窗口中打开文件下载,然后使用JavaScript重定向当前窗口。


可以打开新窗口。你是指通过 AJAX 调用吗?完成后,再通过 window.location 跳转到下一页?但如果用户禁用了 JavaScript 呢? - Raptor
1
类似这样的代码:<a target="_BLANK" href="download-link.php" onclick="location.href = next;">点击这里</a>。如果没有JS,您仍然可以在新窗口中下载文件,并保留旧窗口,因此您可以在页面上放置另一个常规链接,以便用户进入下一页。 - Adam D. Ruppe
一种智能方法和一个良好的备选方案。 - Raptor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接