Скачать файл, не сохраняя его на веб-сервере из вызова AJAX - PullRequest
0 голосов
/ 10 марта 2019

Я отправляю форму с помощью ajax, и после того, как форма отправлена, мне нужно скачать файл pdf, созданный на стороне сервера, с библиотекой php mpdf.Я не хочу сохранять файл pdf на сервере, потому что после того, как пользователь загрузит файл, он больше не нужен.Я искал в Google, и кто-то предлагает использовать объект Blob.Я также возвращаю ответ JSON, чтобы показать пользователю.Может кто-нибудь объяснить, возможно ли это и как этого добиться?большое спасибо

это мой код JavaScript:

              $.ajax({

                    type: form.method,
                    data: $(form).serialize(),
                    dataType: 'JSON',

                    beforeSend: function() {
                        // Show loader
                        $(".loader").show();
                    },


                    success: function(response) {

                        // Hide loader
                        $(".loader").hide();


                        if (response.error_code == '200') {

                            // Add class alert danger to the message
                            $('.alert', $('.horizontal-form')).addClass('alert-success').show();
                            // Show error message
                            $('#error_message').html(response.error_message);
                            // Remove default validation error message from template
                            $('#error_message').get(0).nextSibling.remove();
                            // Remove class alert danger if was left by previous validation
                            $('.alert', $('.horizontal-form')).removeClass('alert-danger');
                            // reset form fields
                            form.reset();
                            // Scroll back to show success message
                            scrollTo(success, -200);

                        }

                    }

                });

и это мой PHP-код

if(isset($_POST['userLetter'])){

                        header("Content-Type", "application/pdf");

                        // Render the view using twig and pass params to it
                        $html=$twig->render('/km-letters/km-letter-new-user.twig', array(
                            // Render user details on twig topbar
                            'prova' => 'pippo'

                        ));

                        $mpdf->WriteHTML($html);


                        return $mpdf->Output('foobar-' . time() . '.pdf','D');


                    }

Также из ответа я получаю следующий заголовок и вижу pdf-файл:

Cache-Control
public, must-revalidate, max-age = 0 Connection
Keep-Alive Content-DescriptionПередача файлов Content-Disposition вложений;filename = "doc.pdf" Content-Transfer-Encoding
двоичный тип контента
application / pdf Дата
вс, 10 марта 2019 11:11:35 GMT истекает сб, 26 июля 1997 05:00:00 GMT Keep-Alive
время ожидания = 5, макс. = 99 Последнее изменение
Вс, 10 марта 2019 11:11:35 GMT Pragma
общедоступный сервер
Apache Transfer-Encoding
chunked XГенератор mPDF 7.1.9 X-Powered-By
PHP / 7.3.0

Но я также получаю следующий очень длинный строковый ответ:

XHRPOST http://router.kondomatica.me/km-users/createUser#[HTTP/1.1 200 OK 332ms]ЗаголовокCookieParametriRispostaTempiAnalisi dello stackPisload rispostax1JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL01lZwCAXIQHIQHIQHIQ1

1 Ответ

0 голосов
/ 11 марта 2019

Основываясь на комментариях к вопросу, вот непроверенное решение, которое должно работать.

Поскольку javascript не может сохранять файлы по соображениям безопасности, код сначала создает объект Blob из ответа, а затем привязку, указывающую на URL-адрес объекта Blob.После этого якорь добавляется в DOM, затем «щелкается» и затем удаляется из DOM.

$.ajax({
    type: form.method,
    data: $(form).serialize(),
    cache: false,

    beforeSend: function() {
        // Show loader
        $(".loader").show();
    },

    success: function(response, responseCode, xhr) {
        // Hide loader
        $(".loader").hide();

        if (responseCode == "200") {
            var disposition = xhr.getResponseHeader('content-disposition');
            var matches = /"([^"]*)"/.exec(disposition);
            var filename = (matches != null && matches[1] ? matches[1] : 'doc.pdf');
            var blob = new Blob(response, {
                type: 'application/pdf'
            });
            var link = document.createElement('a');

            link.href = window.URL.createObjectURL(blob);
            link.download = filename;

            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);

            // Add class alert danger to the message
            $(".alert", $(".horizontal-form"))
            .addClass("alert-success")
            .show();
            // Show error message
            $("#error_message").html(response.error_message);
            // Remove default validation error message from template
            $("#error_message")
            .get(0)
            .nextSibling.remove();
            // Remove class alert danger if was left by previous validation
            $(".alert", $(".horizontal-form")).removeClass("alert-danger");
            // reset form fields
            form.reset();
            // Scroll back to show success message
            scrollTo(success, -200);
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...