Spring mvc动态文件下载

文件下载不能使用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是可以设置保存自定义路径。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值