PHP生成文件下载然后重定向
我有一个PHP应用程序,创建一个CSV文件,强制使用标题下载。 以下是代码的相关部分:
header('Content-Type: application/csv'); header("Content-length: " . filesize($NewFile)); header('Content-Disposition: attachment; filename="' . $FileName . '"'); echo $content; exit();
我想要做的是在构建文件并发送下载提示后将用户重定向到新页面。 只是添加header("Location: /newpage")
到最后并没有工作,预计,所以我不知道如何操纵这一点。
我不认为这可以做 – 虽然我不是100%确定。
常见的事情(例如在流行的下载网站中)是相反的:首先进入后页,然后开始下载。
因此,将您的用户重定向到最终页面(除其他外):
您的下载应该自动启动。 如果没有点击[a href="create_csv.php"]here[/a]
。
至于启动下载(例如自动调用create_csv.php),您有很多选择:
- HTML:
[meta http-equiv="refresh" content="5;url=http://site/create_csv.php"]
- Javascript:
location.href = 'http://site/create_csv.php';
- iframe:
[iframe src="create_csv.php"][/iframe]
在真正需要的情况下很容易做到。
但是你需要在JavaScript和cookies上做一些工作:
在PHP中,你应该添加设置一个cookie
header('Set-Cookie: fileLoading=true');
那么在你打电话下载的页面上,你应该跟踪JS(例如每秒一次),如果有像这样的cookie(这里使用的插件jQuery cookie ):
setInterval(function(){ if ($.cookie("fileLoading")) { // clean the cookie for future downoads $.removeCookie("fileLoading"); //redirect location.href = "/newpage"; } },1000);
现在,如果文件开始被下载,JS会识别它并重定向到删除cookie后所需的页面。
当然,你可以告诉你需要浏览器来接受cookies,JavaScript等等,但是它是有效的。
您要发送的标头是HTTP标头。 浏览器将其作为页面请求并将其作为页面进行处理。 在你的情况下,它需要下载一个页面。
因此,添加一个重定向头文件会混淆整个下载文件的过程(因为头文件被收集,生成一个头文件然后发送到浏览器,你可以通过设置多个重定向头文件IIRC来试试)
但是请记住,IE用户自动启动可下载的文件将触发安全警告标签。 daremon概述的所有三种方法都会显示这个警告。 你根本无法解决这个问题。 如果你提供真正的链接,你会得到更好的服务。
使用以下命令启动包含CSV下载的PHP文件:
<a onclick="popoutWin(\'csvexport.php\')" >Download CSV File</a>
要么
<input name="newThread" type="button" value="Download CSV File" onclick="popoutWin(\'csvexport.php\')" />
JavaScript函数popoutWin
在哪里
/* * Popout window that self closes for use with downloads */ function popoutWin(link){ var popwin = window.open(link); window.setTimeout(function(){ popwin.close(); }, 500); }
这将打开一个窗口,显示CSV下载提示,然后立即关闭窗口,只留下提示。
我发现一个解决方法,这依赖于JavaScript,所以它不是很安全,但对于不安全的关键网站,它似乎工作。
有一个标题为“下载”的按钮,其中的动作设置为指向下载脚本,然后使用javascript在onsubmit处理程序上放置一些东西,去掉下载按钮并替换屏幕上的消息。 下载应该仍然会发生,屏幕将会改变。 很显然,如果下载脚本出现问题,即使不下载,下载仍然看起来很成功,但是这是我现在最好的。
您可以尝试重定向到URL以及代表文件内容的参数。 在重定向中,您可以输出文件内容以供下载。
这是一个很老的问题,但这是我通过JS实现的。
// Capture the "click" event of the link. var link = document.getElementById("the-link"); link.addEventListener("click", function(evt) { // Stop the link from doing what it would normally do. evt.preventDefault(); // Open the file download in a new window. (It should just // show a normal file dialog) window.open(this.href, "_blank"); // Then redirect the page you are on to whatever page you // want shown once the download has been triggered. window.location = "/thank_you.html"; }, true);
答案是:
是工作!
你需要三个不同的代码部分:
HTML
<a id="download_btn" class="btn btn-primary" href="?file=filename&download=1">Download<&/a>
JQuery的
$('#download_btn').click(function(){ window.location.href = '<?=base_url()?>/?file=<?=$file;?>&download=1'; }).focusout (function(){ window.location.href = '<?=base_url()?>'; return false; });
PHP
if(isset($_GET['download']) && isset($_GET['file'])){ $zip_path = 'path_to/'.$_GET['file'].'.zip'; if(file_exists($zip_path)){ header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="'.basename($zip_path).'"'); header('Content-Length: ' . filesize($zip_path)); header('Location: '.$zip_path); } }