Из-за различных проблем с безопасностью манипулирования файлами я вынужден отправить запрос через вызов метода 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 секунд.
Пожалуйста помоги. Я занимался этим весь вечер и, кажется, не могу понять неопределенного ответа.
попробуйте найти, есть ли проблема на стороне сервера, если таковая имеется, поэтому поместите System.out.print, чтобы узнать журнал на стороне сервера.
@RahulDudharejiya OP говорит, что «В разделе« Инструменты проверки »я вижу успешный запрос и данные большого двоичного объекта в ответ», так что, по-видимому, это не проблема
если ваш ответ полностью идеален, то он должен успешно войти в систему, поэтому на стороне сервера должна быть какая-то проблема, попробуйте выполнить отладку на стороне сервера
@RahulDudharejiya, как и упомянул Фил, если я попробую использовать обычный form.submit (), он будет загружен с той же стороны сервера без каких-либо проблем, так что это не проблема.
@Phil, предупреждая все три, дает undefined для err, ошибку для статуса и для объекта ошибки, сообщение как «InvalidStateError: не удалось прочитать свойство responseXML из XMLHttpRequest»: значение доступно только в том случае, если 'responseType' объекта равен '' или 'документ' (было 'blob') ".
Быстрый поиск показывает, что jQuery не очень хорошо обрабатывает двоичные загрузки. Большинство предложений рекомендуют XMLHttpRequest, хотя в наши дни я бы сначала попробовал fetch.
@ Фил, ты классный и указал мне правильное направление. Я использовал обычный XMLHttpRequest, и он отлично работал. Я хотел использовать jQuery для кроссбраузерной совместимости, но не понимал, что это будет проблемой. Связано ли это с версией jQuery 1.8? Если да, то я могу изменить версию, даже если не знаю, сломается ли это что-то еще. Переоценена ли кроссбраузерная совместимость, заявленная в Интернете для использования jQuery.
@Phil, я не могу принять ваш ответ в качестве комментария, если вы можете опубликовать в качестве ответа, я приму ваш ответ



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы упомянули в своем form.submit (), он работает без каких-либо проблем. Какой тип вы используете, POST или GET? Я пытаюсь изменить его в вашем запросе ajax. Я не профессионал в области Java, но, возможно, ваш сервлет реагирует только на запросы GET. Когда я работал с Ajax и сервлетами, я использовал http-сервлет, в котором я перезаписал метод doGet.
Я использовал метод POST, а сервлет реализует метод doPost. form.submit () использует сообщение, поскольку форма определена с помощью method = "post"
Для загрузки 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. Он переходит в блок ошибок, и предупреждение отображается как неопределенное.
Почему бы вам не попробовать зарегистрировать два других аргумента, переданных вашему обратному вызову
error(т.е.console.error(status, error))? Кто знает, могут ли они пригодиться.