PHP генерирует файл для скачивания, затем перенаправляет - PullRequest
60 голосов
/ 05 мая 2009

У меня есть приложение 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 ]

81 голосов
/ 05 мая 2009

Я не думаю, что это можно сделать, хотя я не уверен на 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]
9 голосов
/ 21 ноября 2013

очень легко сделать, если это действительно необходимо.

Но вам понадобится немного поработать с JavaScript и куки:

в 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.

Конечно, вы можете сказать, что вам нужен браузер для приема куки, JavaScript и т. Д., Но он работает.

8 голосов
/ 05 мая 2009

Заголовок, который вы отправляете, является заголовком HTTP. Браузер принимает это как запрос страницы и обрабатывает его как страницу. А в твоем случае это страница, которую нужно скачать.

Таким образом, добавление заголовка перенаправления, который запутывает весь процесс загрузки файла (поскольку заголовки собираются, генерируются в один заголовок и затем отправляются в браузер, вы можете попробовать это, установив несколько заголовков перенаправления IIRC)

2 голосов
/ 25 октября 2011

Имейте в виду, однако, что автоматический запуск загружаемых файлов для пользователей IE вызовет вкладку предупреждения безопасности. Все три метода, описанные daremon, показывают это предупреждение. Вы просто не можете обойти это. Вам будет лучше обслужено, если вы предоставите реальные ссылки.

1 голос
/ 23 декабря 2017
<?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.

1 голос
/ 14 марта 2012

Я нашел один обходной путь для этого, который опирается на javascript, поэтому он не совсем безопасен, но для небезопасных критических сайтов это, кажется, работает.

Иметь форму с кнопкой «скачать» с установленным действием, указывающим на скрипт загрузки, а затем с помощью javascript поместить в обработчик onsubmit что-то, удаляющее кнопку загрузки и заменяющее сообщения на экране. Загрузка все равно должна произойти, и экран изменится. Очевидно, что если есть проблема со скриптом загрузки, то все равно похоже, что загрузка прошла успешно, даже если она не запускается, но это лучшее, что у меня есть сейчас.

0 голосов
/ 29 октября 2018

Хмм ...

Поместите код ниже в основной 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 на новой странице, генерируя загрузку.

0 голосов
/ 07 сентября 2017

Вот ответ:
Это работа!
Вам нужны три разные части кода:

HTML

<a id="download_btn" class="btn btn-primary" href="?file=filename&download=1">Download<&/a>


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

        }
0 голосов
/ 11 мая 2017

Запустите файл PHP, содержащий загрузку CSV, используя:

<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, а затем немедленно закройте окно, оставив только приглашение.

0 голосов
/ 15 сентября 2014

Это довольно старая проблема, но вот как я добился ее с помощью 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...