Загрузить файл из сервлета с помощью Ajax

Я создал zip-файл в своем сервлете. Теперь я хотел бы запустить этот сервлет с помощью Ajax и предложить пользователю диалог загрузки. Я могу запустить сервлет, но я не знаю, как открыть диалоговое окно сохранения. Как мне этого добиться?

15
задан BalusC 29 June 2015 в 06:27
поделиться

2 ответа

Вы не можете «загрузить файл с помощью AJAX». AJAX - это загрузка данных с сервера для обработки JavaScript.

Чтобы пользователь мог загрузить файл, используйте простую ссылку на файл / сервлет или, если вам действительно очень нужно использовать JavaScript, присвойте URL-адрес document.location.href .

Также вам необходимо убедиться, что сервер (или в данном случае сервлет) отправляет соответствующий тип MIME, в случае ZIP-файла, скорее всего, application / zip .

10
ответ дан 1 December 2019 в 03:51
поделиться

Для этого нельзя использовать Ajax. По сути, вы хотите, чтобы конечный пользователь сохранял содержимое файла в файловой системе локального диска, а не назначал содержимое файла переменной JavaScript, где он ничего не может с этим сделать. По очевидным причинам безопасности JavaScript не имеет средств для программного запуска диалогового окна Сохранить как , в котором содержимое файла предоставляется из произвольной переменной JavaScript.

Просто укажите обычную ссылку на URL-адрес сервлета и позвольте сервлету установить заголовок HTTP Content-Disposition как вложение . Именно этот заголовок заставит браузер открыть диалоговое окно Сохранить как . Основная страница останется такой же и не будет обновляться или около того, достигая того же опыта, что и с 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 () .

См. Также:

9
ответ дан 1 December 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: