Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用jQueryAjax和SpringMVC3从服务器下载文件_Jquery_Spring Mvc_Download - Fatal编程技术网

如何使用jQueryAjax和SpringMVC3从服务器下载文件

如何使用jQueryAjax和SpringMVC3从服务器下载文件,jquery,spring-mvc,download,Jquery,Spring Mvc,Download,我想实现从服务器下载(使用AJAX)上传的文件。在服务器端,我编写了代码 @RequestMapping(value = "/getInvoice/approvalId/{approvalId}", method = RequestMethod.GET) public @ResponseBody byte[] getInvoice(@PathVariable("approvalId") Integer approvalId, HttpServletResponse response) throw

我想实现从服务器下载(使用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. ***
HTTP/1.1200正常
服务器:ApacheCoote/1.1
内容处置:附件;filename=“invoice.pdf”
Pragma:没有缓存
缓存控制:没有缓存
内容类型:应用程序/八位字节流;字符集=UTF-8
内容长度:1028351
日期:2011年7月17日星期日08:16:41 GMT
%PDF-1.4
%����
60 obj
endobj
外部参照
6 238 
***FIDDLER:RawDisplay被截断为128个字符。右键单击以禁用截断***

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

也许更好的策略是使用jQuery在页面上构建一个新链接,该链接将引用相同的URL,并在DOM中的适当位置插入新元素。完成后,jQuery甚至可以为用户单击它,开始下载。

通常使用两个选项,但都不涉及AJAX。jQuery也不会有很大帮助

选项1:IFrame 在页面中放置一个不可见的IFrame:

<iframe id="downloadFrame" style="display:none"></iframe>
设置IFrame URL将触发浏览器显示下载对话框

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

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

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

注 我不确定是否所有的浏览器都能可靠地显示带有PDF文件的下载对话框。某些浏览器可能会尝试在浏览器本身中显示它。HTTP头是有用的,但不能保证。

jQuery的答案是:

$(“#下载框架”).remove();//如果框架不存在,则不会失败 $('body')。追加(''); $('#downloadFrame').attr('src','/downloadUrlGoesher');
我会提到这个问题:[-包括一个jQuery插件来完成这个任务。我决定不使用@ResponseBody返回字节[]。现在我设置了responses头private void setPdfHeaders(HttpServletResponse,String shortFileName,File File){response.setContentType(“application/pdf”);response.setHeader(“内容处置”、“附件;文件名=“+shortFileName”);response.setHeader(“内容长度”,String.valueOf(file.Length());}然后将流写入您推荐的响应OutputStream和用户选项2。我喜欢iframe选项,但希望添加一个注释。从服务器提供文档时,您需要适当设置mime类型,否则将无法获得正确的浏览器对话框交互。例如,我的后端设置为“text/plain”“对于.xlsx文档,没有乐趣。不幸的是,出于明显的安全原因,您无法以编程方式单击链接。
window.location.href = "/getInvoice/approvalId/123";
$('#downloadFrame').remove(); // This shouldn't fail if frame doesn't exist $('body').append('<iframe id="downloadFrame" style="display:none"></iframe>'); $('#downloadFrame').attr('src','/downloadUrlGoesHere');