Как передать заголовки из PHP в JS?

103
21 июня 2019, 12:10

Есть следующая проблема:

Допустим, я отправляю данные формы в PHP через стандартный submit формы, без использования js. На стороне PHP я обрабатываю данные формы и формирую заголовки для формирования Эксель файла, которые вывожу командой echo:

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=Rep' . '.csv');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
echo "num;date;phone;fio;status;\n";
/* Здесь формируемы данные по циклу */
exit;

Такой вариант работает хорошо, и по итогу отработки скрипта у меня скачивается файл.

Но что делать, если мне нужно отправить запрос не стандартным submit формы из html, а POST-запросом из JS в PHP?

    $('#dont_issue').click(function() {
        $.post('/admin/plugins/subscribe/index.php?act=analyticDownload', {'id': id}, function (res) {
        });
    });

Таким образом я передаю ID в PHP-скрипт, который получает данные из базы данных и в итоге должен сформировать Эксель файл с соответствующими заголовками. Т.е. теперь все заголовки и данные формируемые в серверной части теперь должны возвращаться в JS. Как указать JS-скрипту, что он должен запустить скачивание файла так же, как и в первом случае?

Answer 1
$.ajax({
type: "POST",
url: url,
data: params,
success: function(response, status, xhr) {
    // читаем заголовок от PHP и получаем имя файла
    var filename = "";
    var disposition = xhr.getResponseHeader('Content-Disposition');
    if (disposition && disposition.indexOf('attachment') !== -1) {
        var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
        var matches = filenameRegex.exec(disposition);
        if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
    }
    var type = xhr.getResponseHeader('Content-Type');
    var blob = new Blob([response], { type: type });
    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        //https://msdn.microsoft.com/en-us/library/hh772331(v=vs.85).aspx
        //Сохраняем на диск
        window.navigator.msSaveBlob(blob, filename);
    } else {
        var URL = window.URL || window.webkitURL;
        var downloadUrl = URL.createObjectURL(blob);
        if (filename) {
            // создадим ссылку с атрибутом HTML5 a[download] для указания имени файла
            var a = document.createElement("a");
            if (typeof a.download === 'undefined') {
                window.location = downloadUrl;
            } else {
                a.href = downloadUrl;
                a.download = filename;
                document.body.appendChild(a);
                a.click();
            }
        } else {
            window.location = downloadUrl;
        }
        setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); // чистим мусор)
    }
}
});

Осторожно используются экспериментальные технологии ;) https://developer.mozilla.org/ru/docs/Web/API/URL/createObjectURL https://developer.mozilla.org/ru/docs/Web/API/URL/revokeObjectURL

Answer 2

Можно еще поступить так (правда немного зашкварно) На серверной части "отрендерить" JavaScript код

Например

<?php
    $someHeaderParam = 'XMLHttpRequest';
    $script = <<<EOF
       <script>
           var header = {$someHeaderParam};
       </script>
    <<<EOF;
READ ALSO
Мозайка JavaScript

Мозайка JavaScript

Сейчас мозаику можно собрать в любой последовательности, но надо чтобы последовательно, то есть сначала к первой мозаике вторую, ко второй...

128
Работа с фреймом

Работа с фреймом

Есть фрейм с вычислением площадиНикак не могу понять как сделать, чтобы при совершении вычислений, менялся фон фрейма

132
Как сделать такую форму для секции?

Как сделать такую форму для секции?

сколько себя помню всегда верстал такие секции след образомПросто брал картинку в таком формате и ставил как background

172
Как создать такую кнопку с помощью СSS?

Как создать такую кнопку с помощью СSS?

Здравсвтуйте! Есть прикрепленное изображениеОно является кнопкой меню навигации по сайту

152