使用Ajax从Servlet下载文件

15

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

3个回答

10

你不能使用AJAX下载文件。AJAX的作用是从服务器下载数据供JavaScript处理。

如果要让用户下载文件,可以使用简单的链接到文件/Servlet,或者如果你真的非常需要使用JavaScript,那么可以将URL赋值给document.location.href

此外,你需要确保服务器(在这种情况下为Servlet)发送适当的MIME类型,在ZIP文件的情况下,最可能的是application/zip


问题是:在一个链接上,我需要下载一个文件,但我不想导航到另一个页面。我已经尝试通过表单调用servlet来解决这个问题,这个方法可以正常工作,但现在我需要在点击链接时下载文件。 - Vinay
3
嗯?使用普通链接<a href="/path/to/file">下载</a>将在单击链接时“下载文件”。 - RoToRa

9
您无法使用Ajax来实现此功能。您的基本需求是让最终用户将文件内容保存到本地磁盘文件系统中,而不是将文件内容分配给JavaScript变量,因为它对此无法做任何事情。出于明显的安全原因,JavaScript没有编程触发“另存为”对话框的设施,其中文件内容来自任意JavaScript变量。
只需使用普通的链接指向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对其执行。

另请参阅:


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

3
Ajax部分完全不必要。它无论如何都不起作用(正如其他人所回答的)。只有最后四行是足够的。如果您可以保证服务器端返回“Content-Disposition: attachment”,则更容易使用window.location = url; - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接