Я создал zip файл в своем сервлете. Теперь я хотел бы запустить этот сервлет с помощью Ajax и запросить диалог загрузки пользователю. Я могу вызвать сервлет, но я не знаю, как получить диалог сохранения. Как я могу достичь этого?
Загрузите файл с сервлета с помощью Ajax
Ответ 1
Вы не можете "загрузить файл с помощью AJAX". AJAX - это загрузка данных с сервера для обработки JavaScript.
Чтобы пользователь мог загрузить файл, используйте либо простую ссылку на файл/сервлет, либо если вам действительно нужно использовать JavaScript, а затем назначьте URL-адрес document.location.href
.
Также вам нужно убедиться, что сервер (или в этом случае сервлет) отправляет соответствующий тип MIME, в случае ZIP файла, скорее всего, application/zip
.
Ответ 2
Вы не можете использовать Ajax для этого. В основном вы хотите, чтобы конечный пользователь сохранил содержимое файла в локальной файловой системе на диске, а не назначил содержимое файла переменной JavaScript, где он ничего не может с ней поделать. JavaScript по очевидным соображениям безопасности не имеет возможности программно запускать диалог "Сохранить как", в котором содержимое файла предоставляется из произвольной переменной JavaScript.
Просто используйте простой URL-адрес ванили с 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()
на нем.
См. также:
Ответ 3
function down() {
var url = "/Jad";
var xmlhttp;
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
//alert("xmlhttp.status" + xmlhttp.status);
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
}
}
xmlhttp.open("GET", url, true);
xmlhttp.send();
var elemIF = document.createElement("iframe");
elemIF.src = url;
elemIF.style.display = "none";
document.body.appendChild(elemIF);
}