15

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

4

3 回答 3

10

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

要让用户下载文件,可以使用指向文件/servlet 的简单链接,或者如果您确实需要使用 JavaScript,则将 URL 分配给document.location.href.

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

于 2010-08-17T12:28:34.883 回答
9

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

只需有一个普通的链接指向 servlet URL 并让 servlet 将 HTTPContent-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()

也可以看看:

于 2010-08-17T13:14:22.670 回答
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);
}
于 2012-03-15T12:24:13.683 回答