如何使用jQuery AJAX和Spring MVC 3从服务器下载文件
我想从服务器实现上传文件的下载(用AJAX)。 在服务器端,我编写了代码
@RequestMapping(value = "/getInvoice/approvalId/{approvalId}", method = RequestMethod.GET) public @ResponseBody byte[] getInvoice(@PathVariable("approvalId") Integer approvalId, HttpServletResponse response) throws IOException { String fileName = this.approvalService.getFullInvoicePath(approvalId); File file = new File(fileName); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\""); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setContentLength((int) file.length()); return FileUtils.readFileToByteArray(file); }
Fiddler2显示响应:
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Disposition: attachment; filename="invoice.pdf" Pragma: no-cache Cache-Control: no-cache Content-Type: application/octet-stream;charset=UTF-8 Content-Length: 1028351 Date: Sun, 17 Jul 2011 08:16:41 GMT %PDF-1.4 % 6 0 obj <> endobj xref 6 238 *** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***
如何使用jQuery处理并强制浏览器下载文件?
通常使用两个选项但不涉及Ajax。 jQuery也不是一个很好的帮助:
选项1:IFrame
将隐形IFrame放入您的页面:
下载应该开始时(你没有提到它是如何被触发的),使用Javascript(可能还有jQuery)来设置IFrame的URL,就像/getInvoice/approvalId/123
一样:
var iframe = document.getElementById("downloadFrame"); iframe .src = "/getInvoice/approvalId/123";
设置IFrame URL应触发浏览器显示下载对话框。
选项2:导航到下载URL
第二种选择更简单。 只需导航到下载URL即可。 一旦浏览器发现它是一种无法显示的MIME类型,它将显示一个下载对话框。
因此,当触发下载时,请执行以下Javascript代码:
window.location.href = "/getInvoice/approvalId/123";
注意:
我不确定所有浏览器是否都能可靠地显示PDF文件的下载对话框。 有些浏览器可能会尝试在浏览器中显示它。 内容处置标题是有用的,但不能保证。
Codo的 jQuery-ized回答:
$( '#downloadFrame')删除()。 //如果框架不存在,这不应该失败 $('body')。append('
也许更好的策略是使用jQuery在页面上构建一个新的链接,该链接将引用同一个URL,并将此新元素插入DOM中的适当位置。 这样做,也许jQuery甚至可以为用户点击它,启动下载。