Отправка формы jQuery ajax для возвращаемого файла с неопределенным ответом об ошибке

Из-за различных проблем с безопасностью манипулирования файлами я вынужден отправить запрос через вызов метода Ajax post. URL-адрес на стороне сервера получает это и выдает PDF-файл в качестве ответа. Код на стороне сервера в Java-сервлете приведен ниже.

            ServletOutputStream out = response.getOutputStream();
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment;filename = " + outFile);
        //create the pdf file
        response.flushBuffer();

На стороне клиента код javascript отправляет вызов POST, который вызывает указанный выше код через doPost. Когда форма отправляется через form.submit (), файл загружается как файл pdf. При попытке выполнить вызов Ajax он дает мне неопределенный ответ в разделе ошибок. Код на стороне клиента, как показано ниже.

    var formData = new FormData();
//Fill formData with fields and files
    console.info('Posting form from ajax');
    $.ajax({
        url: "/createPdf",
        type: "POST",
        data: formData,
        contentType: false,
        processData: false,
        xhrFields: {
            responseType: 'blob'
        },
        success: function (response, status, xhr) {
            console.info('Processing response');
            download(response, "merged.pdf", "application/pdf" );

        },
        error: function (xhr, status, error) 
        { 
            var err = xhr.responseText; 
            alert(err); 
        }

Вышеупомянутое не соответствует успешному ответу. Идет ошибка и предупреждение как неопределенное. Что я здесь делаю не так. Моя версия jquery - 1.8.0.min.js, если это имеет значение. функция загрузки относится к http://danml.com/download.html, но я пробовал и другие фрагменты, но это даже не увенчалось успехом.

В инструментах проверки я вижу в ответ запрос об успешном выполнении и данные большого двоичного объекта, но для отображения данных большого двоичного объекта в разделе Сеть в браузере требуется около 10-15 секунд.

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

Почему бы вам не попробовать зарегистрировать два других аргумента, переданных вашему обратному вызову error (т.е. console.error(status, error))? Кто знает, могут ли они пригодиться.

Phil 21.11.2018 06:00

попробуйте найти, есть ли проблема на стороне сервера, если таковая имеется, поэтому поместите System.out.print, чтобы узнать журнал на стороне сервера.

Rahul Dudharejiya 21.11.2018 06:03

@RahulDudharejiya OP говорит, что «В разделе« Инструменты проверки »я вижу успешный запрос и данные большого двоичного объекта в ответ», так что, по-видимому, это не проблема

Phil 21.11.2018 06:04

если ваш ответ полностью идеален, то он должен успешно войти в систему, поэтому на стороне сервера должна быть какая-то проблема, попробуйте выполнить отладку на стороне сервера

Rahul Dudharejiya 21.11.2018 06:06

@RahulDudharejiya, как и упомянул Фил, если я попробую использовать обычный form.submit (), он будет загружен с той же стороны сервера без каких-либо проблем, так что это не проблема.

Karthik 21.11.2018 06:08

@Phil, предупреждая все три, дает undefined для err, ошибку для статуса и для объекта ошибки, сообщение как «InvalidStateError: не удалось прочитать свойство responseXML из XMLHttpRequest»: значение доступно только в том случае, если 'responseType' объекта равен '' или 'документ' (было 'blob') ".

Karthik 21.11.2018 06:09

Быстрый поиск показывает, что jQuery не очень хорошо обрабатывает двоичные загрузки. Большинство предложений рекомендуют XMLHttpRequest, хотя в наши дни я бы сначала попробовал fetch.

Phil 21.11.2018 06:13

@ Фил, ты классный и указал мне правильное направление. Я использовал обычный XMLHttpRequest, и он отлично работал. Я хотел использовать jQuery для кроссбраузерной совместимости, но не понимал, что это будет проблемой. Связано ли это с версией jQuery 1.8? Если да, то я могу изменить версию, даже если не знаю, сломается ли это что-то еще. Переоценена ли кроссбраузерная совместимость, заявленная в Интернете для использования jQuery.

Karthik 21.11.2018 19:49

@Phil, я не могу принять ваш ответ в качестве комментария, если вы можете опубликовать в качестве ответа, я приму ваш ответ

Karthik 24.11.2018 22:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
9
674
2

Ответы 2

Вы упомянули в своем form.submit (), он работает без каких-либо проблем. Какой тип вы используете, POST или GET? Я пытаюсь изменить его в вашем запросе ajax. Я не профессионал в области Java, но, возможно, ваш сервлет реагирует только на запросы GET. Когда я работал с Ajax и сервлетами, я использовал http-сервлет, в котором я перезаписал метод doGet.

Я использовал метод POST, а сервлет реализует метод doPost. form.submit () использует сообщение, поскольку форма определена с помощью method = "post"

Karthik 21.11.2018 18:52

Для загрузки ajax вы должны динамически добавить ссылку, щелкнуть по триггеру и затем удалить.

var formData = new FormData();
//Fill formData with fields and files
    console.info('Posting form from ajax');
    $.ajax({
        url: "/createPdf",
        type: "POST",
        data: formData,
        contentType: false,
        processData: false,
        xhrFields: {
            responseType: 'blob'
        },
        success: function (response, status, xhr) {
             var a = document.createElement('a');
            var url = window.URL.createObjectURL(response);
            a.href = url;
            a.download = 'myfile.pdf';
            a.click();
            window.URL.revokeObjectURL(url);
        },
        error: function (xhr, status, error) 
        { 
            var err = xhr.responseText; 
            alert(err); 
        }

У меня тоже был этот нормальный поток вместо download.js, но проблема не в динамической ссылке и нажатии, он даже не входит в блок успеха после ответа Ajax. Он переходит в блок ошибок, и предупреждение отображается как неопределенное.

Karthik 21.11.2018 18:49

Другие вопросы по теме