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 也被回显)。但是,HTML 代码仍然显示在 CSV 内容中。

4

2 回答 2

3

使用当前代码,不,您不能。您强制浏览器将更多内容下载到 file.csv,以便忽略较新的标题。

但是,看看元刷新的东西。您将能够在页面加载之间添加延迟(以便用户实际看到网页)并在刷新时发送文件以下载。

我希望我可以添加一个示例,但我目前在火车上被一些哭泣的婴儿包围,我很无聊。

为了防止元标记(和其他 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
}
?>
于 2012-12-17T06:48:40.593 回答
1

您可以在客户端执行此操作:在新窗口中打开文件下载,然后使用 javascript 重定向当前窗口。

于 2012-12-17T04:03:33.347 回答