Pergunta

Eu tenho um aplicativo PHP que cria um arquivo CSV, que é forçado a fazer o download usando cabeçalhos. Aqui está a parte relevante do código:

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

O que eu gostaria de fazer é que os usuários redirecionar para uma nova página depois que o arquivo é construído e o prompt de download é enviado. Basta adicionar header("Location: /newpage") ao fim não trabalho, expectedly, então eu não tenho certeza de como rig isso.

Foi útil?

Solução

Eu não acho que isso pode ser feito -. Embora eu não estou 100% de certeza

A coisa comum (por exemplo, em sites de download) é o inverso:. Primeiro você ir para a após página e, em seguida, inicia o download

Assim redirecionar seus usuários para o final página que (entre outras coisas) diz:

Seu download deve começar automaticamente. Se não, clique [a href="create_csv.php"]here[/a].

Como cerca de iniciar o download (por exemplo, chamando automaticamente create_csv.php) você tem muitas opções:

  • 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]

Outras dicas

muito fácil de fazer no caso é realmente necessário.

Mas você precisa ter um trabalho pouco em JavaScript e cookies:

em PHP você deve adicionar a criação de um cookie

header('Set-Cookie: fileLoading=true'); 

, em seguida, na página onde você chamar o download você deve monitorar com JS (por exemplo, uma vez por segundo) se houver vindo bolinho assim (não é usado plugin de jQuery bolinho aqui):

setInterval(function(){
  if ($.cookie("fileLoading")) {
    // clean the cookie for future downoads
    $.removeCookie("fileLoading");

    //redirect
    location.href = "/newpage";
  }
},1000);

Agora, se o arquivo começa a ser downoaded JS reconhece e redireciona para a página necessário após cookie é apagado.

Claro, você pode dizer que você precisa navegador para aceitar cookies, JavaScript e assim por diante, mas funciona.

O cabeçalho você está enviando são cabeçalhos HTTP. O navegador leva isso como uma solicitação de página e processa-lo como uma página. E no seu caso, uma página que precisa de download.

Assim, adicionando um cabeçalho de redirecionamento para que confunde todo o processo de baixar o arquivo (uma vez que os cabeçalhos são coletados, gerado em um cabeçalho e, em seguida, enviado para o navegador, você pode tentar isso definindo vários cabeçalhos de redirecionamento IIRC)

Tenha em mente, no entanto, o início automático de arquivos para download para usuários do IE irá acionar o guia de aviso de segurança. Todos os três dos métodos descritos por daremon iria mostrar este aviso. Você simplesmente não pode contornar isso. Você será melhor servido se você fornecer links reais.

Eu encontrei uma solução para este que se baseia em javascript, por isso não é exatamente proteger, mas para locais críticos não seguros parece trabalho.

Tenha um formulário com um botão intitulado 'download' com o conjunto de ações para apontar para o script download, em seguida, usando colocar algo javascript no manipulador onsubmit que retira o botão de download e substitui a mensagem na tela. O download deve ainda acontecer e a tela irá mudar. Obviamente, se há um problema com o script de download, então ele ainda se parece com a transferência foi bem sucedida, mesmo se isso não acontecer fogo, mas é o melhor que eu tenho agora.

Esta é uma questão bastante antiga, mas aqui é como eu conseguido isso através de 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);

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

<?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>

Aqui está uma solução usando javascript.

Você pode tentar e redirecionamento para o URL mais um parâmetro que representa o conteúdo do arquivo. E no redirecionamento, você pode produzir o conteúdo do arquivo para download.

Inicie o arquivo PHP que contém o download CSV usando:

<a onclick="popoutWin(\'csvexport.php\')" >Download CSV File</a>

ou

<input name="newThread" type="button" value="Download CSV File"
        onclick="popoutWin(\'csvexport.php\')" />

onde a função popoutWin JavaScript

/*
 * Popout window that self closes for use with downloads
 */
function popoutWin(link){
    var popwin = window.open(link);
    window.setTimeout(function(){
        popwin.close();
    }, 500);
}

Isto irá abrir uma janela, para exibir o download CSV rápida e logo em seguida fechar a janela, deixando apenas o prompt.

Aqui está a resposta:
É um trabalho!
Você precisa de três diferentes partes do código:
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);
            }

        }

Hmmmm ...

Coloque o código abaixo na principal javascript do site.

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

Explicando: Ele faz o redirecionamento normal com php para alguns url você vai difine e em javascipt ele diz: Se o caminho é o mesmo que o caminho que redirecionamento feito '/ url_of_redirect /', então ele abre a url em uma nova página, gerando o downlod.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top