如何使用jQuery AJAX和Spring MVC 3从服务器下载文件

时间:2011-07-17 08:33:54

标签: jquery spring-mvc download

我想从服务器实现上传文件的下载(使用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 <</Linearized 1/L 1028351/O 8/E 1024254/N 1/T 1028185/H [ 5056 544]>>
endobj

xref
6 238 
*** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***

如何处理并强制浏览器使用jQuery下载文件?

3 个答案:

答案 0 :(得分:33)

通常使用两个选项但不涉及Ajax。 jQuery也不会是一个很好的帮助:

选项1:IFrame

将隐藏的IFrame放入您的页面:

<iframe id="downloadFrame" style="display:none"></iframe>

下载应该开始时(你没有提到它是如何被触发的),使用Javascript(可能还有jQuery)来设置IFrame的URL,就像你的/getInvoice/approvalId/123一样:

var iframe = document.getElementById("downloadFrame");
iframe .src = "/getInvoice/approvalId/123";

设置IFrame URL会触发浏览器显示下载对话框。

选项2:导航到下载网址

第二种选择更简单。只需导航到下载URL即可。一旦浏览器发现它是一个无法显示的MIME类型,它将显示一个下载对话框。

因此,当触发下载时,请执行以下Javascript代码:

window.location.href = "/getInvoice/approvalId/123";

注意:

我不确定所有浏览器是否都能可靠地显示包含PDF文件的下载对话框。某些浏览器可能会尝试在浏览器中显示它。 内容处置标题很有帮助,但不能保证。

答案 1 :(得分:4)

jQuery-ized回答Codo

   $('#downloadFrame').remove(); // This shouldn't fail if frame doesn't exist
   $('body').append('<iframe id="downloadFrame" style="display:none"></iframe>');
   $('#downloadFrame').attr('src','/downloadUrlGoesHere');

答案 2 :(得分:2)

也许更好的策略是使用jQuery构建一个新的&lt; A&gt;页面上的链接将引用此相同的URL,并将此新元素插入DOM中的适当位置。这样做,也许jQuery甚至可以为用户点击它,启动下载。