Загрузите файл из сервлета с помощью Ajax - PullRequest
15 голосов
/ 17 августа 2010

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

Ответы [ 3 ]

10 голосов
/ 17 августа 2010

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

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

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

8 голосов
/ 17 августа 2010

Вы не можете использовать 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.

См. также:

0 голосов
/ 15 марта 2012
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);
}
...