У меня есть класс действий, который генерирует PDF-файл. Установлено contentType
соответствующим образом.
public class MyAction extends ActionSupport
{
public String execute() {
...
...
File report = signedPdfExporter.generateReport(xyzData, props);
inputStream = new FileInputStream(report);
contentDisposition = "attachment=\"" + report.getName() + "\"";
contentType = "application/pdf";
return SUCCESS;
}
}
Я вызываю это action
через вызов Ajax. Я не знаю, как передать этот поток браузеру. Я попробовал несколько вещей, но ничего не помогло.
$.ajax({
type: "POST",
url: url,
data: wireIdList,
cache: false,
success: function(response)
{
alert('got response');
window.open(response);
},
error: function (XMLHttpRequest, textStatus, errorThrown)
{
alert('Error occurred while opening fax template'
+ getAjaxErrorString(textStatus, errorThrown));
}
});
Вышеуказанное дает ошибку:
Ваш браузер отправил запрос, который этот сервер не может понять.
источник
content-disposition
установлено значениеattachment
, вы просто получитеSave as
диалог. Родительская страница останется без изменений. Просто<a href="pdfservlet/filename.pdf">pdf</a>
или<form action="pdfservlet/filename.pdf"><input type="submit"></form>
более чем достаточно.POST
данные.Вот как у меня это работает
Обновленный ответ с использованием download.js
источник
Я действительно не думаю, что какой-либо из прошлых ответов выявил проблему исходного плаката. Все они предполагают запрос GET, пока плакат пытался отправить данные и получить в ответ загрузку.
В процессе поиска лучшего ответа мы нашли этот плагин jQuery для запроса загрузки файлов в стиле Ajax .
В своем «сердце» он создает «временную» HTML-форму, содержащую данные в качестве полей ввода. Эта форма добавляется к документу и отправляется по желаемому URL-адресу. Сразу после этого форма снова удаляется:
Обновить ответ Маюра выглядит довольно многообещающим и очень простым по сравнению с плагином jQuery, о котором я говорил.
источник
Вот как я решаю эту проблему.
Ответ Джонатана Аменда на этот пост мне очень помог.
Пример ниже упрощен.
Для получения дополнительной информации приведенный выше исходный код может загрузить файл с помощью запроса JQuery Ajax (GET, POST, PUT и т . Д.) . Это также помогает загружать параметры как JSON и изменять тип содержимого на application / json (мое значение по умолчанию) .
Источник html :
Простая форма с двумя входными текстами, одним элементом выбора и элементом кнопки.
Источник страницы javascript :
Простое событие при нажатии кнопки. Он создает объект AjaxDownloadFile. Источник класса AjaxDownloadFile приведен ниже.
AjaxDownloadFile класс Источник:
Я создал этот класс, чтобы добавить его в свою библиотеку JS. Он многоразовый. Надеюсь, это поможет.
источник
Blob
объект поддерживается в IE10 +.responseType
xhr наarraybuffer
или,blob
чтобы это работало. (В противном случае это отлично работает.)У меня сработал следующий код, так как функция сервера получает
File(memoryStream.GetBuffer(), "application/pdf", "fileName.pdf");:
источник
Вы можете использовать этот плагин, который создает форму и отправляет ее, а затем удаляет ее со страницы.
Это сработало для меня. Нашел этот плагин здесь
источник
Следующий код работал у меня
источник
Чтобы исправить проблему с пустым PDF-файлом в почтовом запросе для получения потоковых данных, таких как PDF, нам нужно добавить в запрос тип ответа как arraybuffer или blob
источник
Что касается ответа, данного Маюром Падшала, это правильная логика для загрузки файла pdf через ajax, но, как сообщают другие в комментариях, это решение действительно загружает пустой pdf.
Причина этого объясняется в принятом ответе на этот вопрос : jQuery имеет некоторые проблемы с загрузкой двоичных данных с использованием запросов AJAX, поскольку он еще не реализует некоторые возможности HTML5 XHR v2, см. Этот запрос на расширение и это обсуждение .
Таким образом, использование
HTMLHTTPRequest
кода должно выглядеть так:источник
создайте скрытый iframe, затем в вашем коде ajax выше:
URL:
document.getElementById('myiframeid').src = your_server_side_url
,и удалите
window.open(response);
источник
Этот фрагмент предназначен для пользователей angular js, которые столкнутся с той же проблемой. Обратите внимание, что файл ответов загружается с использованием запрограммированного события щелчка. В этом случае заголовки были отправлены сервером, содержащие имя файла и контент / тип.
источник
Вы должны делать это с Ajax? Разве это не возможность загрузить его в iframe?
источник
Надеюсь, это сэкономит вам несколько часов и избавит от головной боли. Мне потребовалось некоторое время, чтобы понять это, но выполнение обычного запроса $ .ajax () испортило мой PDF-файл, а запрос его через адресную строку работал отлично. Решение было такое:
Включите download.js: http://danml.com/download.html
Затем используйте XMLHttpRequest вместо запроса $ .ajax ().
источник
источник
Если вам нужно работать с файловым потоком (т.е. без физически сохраненного PDF-файла), как это делаем мы, и вы хотите загрузить PDF-файл без перезагрузки страницы, для нас работает следующая функция:
HTML
Javascript
Из-за target = "pdf-download-output" ответ записывается в iframe, и поэтому перезагрузка страницы не выполняется, но поток pdf-response-stream выводится в браузере как загрузка.
источник