文件下载不能使用ajax实现动态内容文件下载,必须为
Form
才可以弹出下载窗口。
使用
ajax
只会返回内容到页面。
那么问题来,
一般下载都是异步的,我们如果要实现这样效果,应该怎么办?
解决办法:我们可以使用动态创建表单方式模拟异步下载。
1、动态创建表单代码
// Ajax 文件下载
$.ajaxDownload = function (url, data, method) {
if (url && data) {
// data 是 string 或者 array/object
data = typeof data == 'string' ? data : $.param(data);
// 把参数组装成form的input
var inputs = '';
$.each(data.split('&'), function () {
var param = this.split('=');
inputs += '<input type="hidden" name="' + param[0] + '" value="' + param[1] + '" />';
});
$('<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>')
.appendTo('body').submit().remove();
}
}
2、执行下载请求
$.ajaxDownload("/list/book/downLoad","&ids=1,2,3","post");
Java Controller
下载一个excel文件,文件内容为字节码为1,2,3,4,4
<span style="white-space:pre"> </span>ByteArrayOutputStream output = null;
try {
output = new ByteArrayOutputStream();
output.write(new byte[]{1,2,3,4,4,});
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", "TestExcel.xlsx");
return new ResponseEntity<byte[]>(output.toByteArray(),headers, HttpStatus.CREATED);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (output != null) {
output.flush();
output.close();
}
if (wb != null) {
wb.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
注意:如果文件内容需要转换,可以选择正确的Spring转换器。
org.springframework.http.converter.ByteArrayHttpMessageConverter
org.springframework.http.converter.StringHttpMessageConverter
org.springframework.http.converter.StringHttpMessageConverter
需要在“org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter”bean的“<property name="messageConverters">”设置。
注意:目前浏览器chorme和firefox都不弹出保存路径窗口,都使用默认下载路径。只有IE是可以设置保存自定义路径。