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

Я создал zip файл в своем сервлете. Теперь я хотел бы запустить этот сервлет с помощью 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);
}