PHP生成文件以供下载然后重定向

时间:2009-05-05 00:00:48

标签: php redirect header

我有一个PHP应用程序,它创建一个CSV文件,强制使用标题下载。这是代码的相关部分:

header('Content-Type: application/csv'); 
header("Content-length: " . filesize($NewFile)); 
header('Content-Disposition: attachment; filename="' . $FileName . '"'); 
echo $content;
exit(); 

我想做的是在构建文件并发送下载提示后将用户重定向到新页面。只是将header("Location: /newpage")添加到最后,预计不会有效,所以我不确定如何解决这个问题。

11 个答案:

答案 0 :(得分:81)

我不认为这可以做到 - 虽然我不是百分百肯定。

常见的事情(例如在流行的下载网站中)是相反的:首先,您转到之后的页面然后开始下载。

因此,请将您的用户重定向到 final 页面(其中包括):

您的下载应自动开始。如果没有,请点击[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]

答案 1 :(得分:9)

在真正需要的情况下非常容易。

但是你需要在JavaScript和cookie中做一些工作:

在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后所需的页面。

当然,您可以告诉您需要浏览器接受cookie,JavaScript等,但它确实有效。

答案 2 :(得分:8)

您要发送的标头是HTTP标头。浏览器将其作为页面请求并将其作为页面处理。在您的情况下,它需要下载一个页面。

因此,添加重定向标头会混淆下载文件的整个过程(因为标题已收集,生成一个标题然后发送到浏览器,您可以通过设置多个重定向标题IIRC来尝试此操作)

答案 3 :(得分:2)

请记住,为IE用户自动启动可下载文件将触发安全警告选项卡。 daremon概述的所有三种方法都会显示此警告。你根本无法解决这个问题。如果您提供真实的链接,您将获得更好的服务。

答案 4 :(得分:1)

我找到了一个依赖于javascript的解决方法,因此它并不完全安全,但对于非安全的关键网站,它似乎有效。

有一个带有标题为“download”的按钮的表单,其操作设置为指向下载脚本,然后使用javascript在onsubmit处理程序上放置一些内容,删除下载按钮并替换屏幕上的消息。下载仍然应该发生,屏幕也会改变。显然,如果下载脚本存在问题,那么即使它没有触发,它仍然看起来下载成功,但它是我现在最好的。

答案 5 :(得分:1)

<?php 
    function force_file_download($filepath, $filename = ''){
        if($filename == ''){
            $filename = basename($filepath);
        }

        header('Content-Type: application/octet-stream');
        header("Content-Transfer-Encoding: Binary"); 
        header("Content-disposition: attachment; filename=\"" . $filename . "\""); 
        readfile($filepath); // do the double-download-dance (dirty but worky)  
    }

    force_file_download('download.txt');
?>
<script type="text/javascript">
    location = 'page2.php'
</script>

以下是使用javascript的解决方案。

答案 6 :(得分:0)

您可以尝试重定向到URL以及表示文件内容的参数。在重定向中,您可以输出文件内容以供下载。

答案 7 :(得分:0)

这是一个很老的问题,但这是我通过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);

通过 - https://www.daniweb.com/web-development/php/threads/463652/page-not-redirecting-after-sending-headers-in-php

答案 8 :(得分:0)

使用以下命令启动包含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下载提示,然后立即关闭窗口,只留下提示。

答案 9 :(得分:0)

以下是答案:
它的工作!
您需要三个不同的代码部分:

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);
            }

        }

答案 10 :(得分:0)

嗯...

将以下代码放在网站的主要javascript中。

 if (window.location.pathname == '/url_of_redirect/') {
        window.open(location.protocol + '//' + location.hostname + '/url_of_download.zip', '_parent');
    }

说明: 它使用php将普通重定向重定向到您将要定义的某个URL,并在javascipt中说:如果路径名与重定向为'/ url_of_redirect /'的路径相同,则它将在新页面上打开该URL,从而生成向下链接。