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