Intereting Posts
расчет тарифов на такси с использованием php с google distance matrix api v2 PHP-цикл: добавьте div вокруг каждого трех элементов синтаксиса Ошибка mPDF: невозможно найти таблицу xref Преобразование широты / долготы в название города? (обратная геолокация) Как получить изображение пользователя с API-интерфейсом Twitter 1.1? mySQL: объединение трех таблиц – как? Печать записи несколько раз в PHP и MySql Как использовать PHP CURL для обхода кросс-домена Как сохранить изображение, созданное pChart, в файл? «Неустранимая ошибка: невозможно обновить <function>» Учитывая местоположение пользователя, выберите строки, которые включают этого пользователя в их радиус Создание ошибки контроллера в phpprobid Как переопределить Symfony форму ввода MoneyType как type = "number"? Тип hinting – указать массив объектов PHP найти и получить значение на основе другого из HTML-файла проанализированного файла

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 и кукисами:

в 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 и т. Д., Но он работает.

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

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

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

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

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

или

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

где функция 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); } 

Это откроет окно, чтобы отобразить приглашение загрузки 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); 

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

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

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