使用Ajax从Servlet下载文件

时间:2010-08-17 12:17:16

标签: ajax servlets download save-as

我在servlet中创建了一个zip文件。现在我想使用Ajax触发该servlet并向用户提示下载对话框。我可以触发servlet,但我不知道如何获取保存对话框。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:10)

您不能“使用AJAX下载文件”。 AJAX是关于从服务器下载数据以供JavaScript处理的。

要让用户下载文件,请使用指向文件/ servlet的简单链接,或者如果您确实需要使用JavaScript,请将URL指定为document.location.href

此外,您需要确保服务器(或本例中为servlet)发送适当的MIME类型,以防ZIP文件最有可能application/zip

答案 1 :(得分:8)

您无法使用Ajax。您基本上希望让最终用户将文件内容保存到本地磁盘文件系统,而不是将文件内容分配给JavaScript变量,在该变量中它无法对其执行任何操作。出于明显的安全原因,JavaScript没有以编程方式触发另存为对话框的工具,其中文件内容是从任意JavaScript变量提供的。

只需要一个简单的vanilla链接指向servlet URL,然后让servlet将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表单引用servlet的URL并让JavaScript在其上执行form.submit()

另见:

答案 2 :(得分:0)

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);
}