您的位置:首页 > 编程语言 > Java开发

Spring mvc动态文件下载

2016-02-14 22:36 459 查看
文件下载不能使用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是可以设置保存自定义路径。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: