使用Ajax从Servlet下载文件

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

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

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

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

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

只需要一个普通的vanilla链接指向servlet URL,并让servlet将HTTP Content-Disposition标头设置为attachment 。 这是专门这个头,这将迫使浏览器popup另存为对话框。 底层页面将保持不变,不会刷新,达到与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来实现这个function,那么使用一个(隐藏的)同步的POST表单来引用这个servlet的URL,并让JavaScript form.submit()执行一个form.submit()

也可以看看:

  • 在Java Web应用程序中从应用程序服务器外部提供静态数据的最简单方法
  • 静态资源servlet的抽象模板
 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); }