使用Ajax从Servlet下载文件

Vin*_*nay 15 ajax servlets download save-as

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

RoT*_*oRa 10

你不能"使用AJAX下载文件".AJAX是关于从服务器下载数据以供JavaScript处理的.

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

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

  • 咦?使用普通链接`<a href="/path/to/file">下载</a>`**将**"点击链接下载文件". (3认同)

Bal*_*usC 9

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

只需要一个普通的vanilla链接指向servlet URL,然后让servlet将HTTP Content-Disposition标头设置为attachment.它特别是这个标题会强制浏览器弹出另存为对话框.底层页面将保持不变并且不会刷新,因此实现与Ajax相同的体验.

基本上:

<a href="fileservlet/somefilename.zip">download file</a>
Run Code Online (Sandbox Code Playgroud)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...

    response.setHeader("Content-Type", getServletContext().getMimeType(fileName));
    response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");

    // ...
}
Run Code Online (Sandbox Code Playgroud)

这也可以在JavaScript中完成,而不需要触发整个Ajax调用:

window.location = "fileservlet/somefilename.zip";
Run Code Online (Sandbox Code Playgroud)

或者,如果您实际上正在使用POST,那么使用(隐藏的)同步POST表单引用servlet的URL并让JavaScript执行form.submit()它.

也可以看看: