PHP генерирует файл для загрузки, а затем перенаправляет

StackOverflow https://stackoverflow.com/questions/822707

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть приложение 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 и 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 и т. д., но это работает.

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

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

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

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

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

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

Через -

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

Вы можете попытаться перенаправить на URL-адрес плюс параметр, который представляет содержимое файла. А в редиректе вы можете вывести содержимое файла для скачивания.

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

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

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

        }

Хмммм...

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

scroll top