Подтвердить что ты не робот

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") до конца не получилось, как ожидается, поэтому я не уверен, как это сделать.

4b9b3361

Ответ 1

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

Ответ 2

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

Но вам нужно немного поработать над 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.

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

Вы можете попробовать перенаправить URL-адрес и параметр, представляющий содержимое файла. И в перенаправлении вы можете выводить содержимое файла для загрузки.

Ответ 8

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

Ответ 9

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

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

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