Вы не можете использовать Ajax для этого.По сути, вы хотите, чтобы конечный пользователь сохранял содержимое файла в файловой системе локального диска, а не назначал содержимое файла переменной JavaScript, где он ничего не может с этим сделать.JavaScript по понятным причинам безопасности не имеет средств для программного запуска диалогового окна Сохранить как , при котором содержимое файла предоставляется из произвольной переменной JavaScript.
Просто укажите обычную ванильную ссылку на URL сервлетаи пусть сервлет установит заголовок HTTP Content-Disposition
на attachment
.Именно этот заголовок заставит браузер открыть диалог Сохранить как .Базовая страница останется такой же и не будет обновляться или около того, достигая того же опыта, что и с Ajax.
В основном:
<a href="fileservlet/somefilename.zip">download file</a>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
response.setHeader("Content-Type", getServletContext().getMimeType(fileName));
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
// ...
}
Это также может быть сделано в JavaScript, как показано нижебез запуска всего вызова Ajax:
window.location = "fileservlet/somefilename.zip";
В качестве альтернативы, если вы на самом деле используете для этого POST, тогда используйте (скрытую) синхронную POST-форму со ссылкой на URL сервлета и позвольте JavaScript выполнить form.submit()
наit.
См. также: