使用 Ajax 从 Servlet 下载文件

Posted

技术标签:

【中文标题】使用 Ajax 从 Servlet 下载文件【英文标题】:Download a file from Servlet using Ajax 【发布时间】:2011-03-30 22:59:30 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

您还需要确保服务器(或者在这种情况下是 servlet)发送适当的 MIME 类型,如果是 ZIP 文件,则很可能是application/zip

【讨论】:

问题是在一个链接上我必须下载一个文件,我不想导航到另一个页面,我已经通过表单调用 servlet 进行了尝试,效果很好,但现在我需要下载点击链接文件。 嗯?使用普通链接<a href="/path/to/file">Download</a>“点击链接下载文件”。【参考方案2】:

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

只要有一个指向 servlet URL 的普通链接,让 servlet 将 HTTP Content-Disposition 标头设置为 attachment。正是这个标题将强制浏览器弹出 Save As 对话框。底层页面将保持不变,不会刷新左右,实现与 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()

另见:

Simplest way to serve static data from outside the application server in a Java web application Abstract template for a static resource servlet

【讨论】:

【参考方案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);

【讨论】:

完全不需要ajax部分。无论如何它都行不通(正如其他人所回答的那样)。只需最后四行就足够了。如果你能保证服务器端返回Content-Disposition:attachment,那么使用window.location = url;就容易多了。

以上是关于使用 Ajax 从 Servlet 下载文件的主要内容,如果未能解决你的问题,请参考以下文章

通过ajax调用servlet下载文件。

在jsp中调用ajax送了一个需下载的文件名给servlet,下载完成文件后需用需返回一个字符串,但是总是出错

如何在调用 servlet 后使用 ajax 在 iframe 中显示 PDF

如何从 servlet 将文本响应流式传输到 jsp?

从 GWT 调用 servlet 并使用 servlet 生成的 post 数据和下载文件

java ajax如何实现文件下载