原因:ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,ajax没法解析后台返回的文件流,所以无法处理二进制流response输出来下载文件。

解决方法:使用form表单提交实现文件下载

1,后台代码实现方法:

// 生成excel文件
@RequestMapping(value = "/study", method = RequestMethod.POST)
public void study(@RequestBody ParamVO paramVO, HttpServletResponse response) throws UnsupportedEncodingException {
response.setContentType("application/octet-stream;charset=utf-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + new String(paramVO.getFileName().getBytes("utf-8"), "iso-8859-1"));
try (ByteArrayOutputStream bos = templateService.excel(paramVO);
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream())) {
out.write(bos.toByteArray());
response.setHeader("Content-Length", String.valueOf(bos.toByteArray().length));
} catch (Exception e) {
e.printStackTrace();
}
}

2,前端页面使用Ajax下载文件

var xhr = new XMLHttpRequest();
xhr.open('post', 'http://localhost:8080/user/export', true);
xhr.responseType = 'blob';
xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8');
xhr.onload = function () {
if (this.status == 200) {
var blob = this.response;
var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
a.href = url;
//设置文件名称
a.download = '用户信息.xls';
a.click();
}
}
xhr.send(JSON.stringify({
"type" : 1,
"startDate" : "2018-01-01",
"endDate" : "2018-12-31"
}));
}

或者前端也可以这样实现:

{
var xhr = new XMLHttpRequest();
xhr.open('post', 'http://localhost:8080/user/export', true);
xhr.responseType = 'blob';
xhr.onload = function () {
var blob = this.response;
if(window.navigator.msSaveOrOpenBlob){
window.navigator.msSaveBlob(blob, 'msSaveBlob_testFile.txt');
}else{
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = 'msSaveBlob_testFile.txt';
link.click();
window.URL.revokeObjectURL(link.href);
}
xhr.send(null);
}
}

本文转自:https://blog.csdn.net/hj7jay/article/details/86309968

用ajax下载字节流形式的excel文件的更多相关文章

  1. ajax发送请求下载字节流形式的excel文件

    背景 开发项目中导出功能,因为数据量有点大,所以导出可能需要时间有点长,所以想用ajax异步请求. 存在问题 利用传统的js和jquery提供的ajax相关获取响应的方式是无法实现excel文件下载的 ...

  2. 【ABAP系列】SAP ABAP下载带密码的Excel文件

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP下载带密码的Ex ...

  3. jQuery+php+ajax+PHPExcel实现上传excel文件导入数据库

            项目中需要批量导入数据,感觉这个需求以后也会经常用,必须总结分享下: 引入jquery的第三方表单插件: <scripttype="text/javascript&qu ...

  4. IE浏览器下载后台返回的Excel文件,报错400

    问题描述(见下图): 问题分析: 400是后端没有接收到请求 原因是后端高版本的tomcat不会自动对字符串进行转义 所以,前端把参数值进行转义,即encodeURI(string) 问题处理前代码( ...

  5. ASP.NET读取EXCEL文件的三种经典方法(转)

    1.方法一:采用OleDB读取EXCEL文件:  把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:public DataSet ExcelToDS(string Path) {  str ...

  6. ASP.NET读取EXCEL文件的三种经典方法

      1.方法一:采用OleDB读取EXCEL文件:   把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { ...

  7. JXL包大解析;Java程序生成excel文件和解析excel文件内容

    最近需求变化,需要把excel导入 我以前没有做过,所以我查了一些资料 和参考别人的代码 以下是多种方式: import java.io.File; import java.io.FileInputS ...

  8. C# 读取EXCEL文件的三种经典方法

    1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { stri ...

  9. asp.net读取excel文件多种方法

    asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取.   方法一:采用OleDB读取Excel文件 把Excel文件 ...

随机推荐

  1. C# Work PPT to PDF

    //// <summary> /// 把ppt文件转换成pdf文件2 /// </summary> /// <param name="sourcePath&qu ...

  2. AGC 007D.Shik and Game(DP)

    题目链接 \(Description\) 数轴上有一个人,从\(0\)出发到\(E\),速度为\(1\).数轴上还有\(n\)只熊,每只熊会在经过后的\(T\)时刻后产生一个金币.给定\(E,T\)以 ...

  3. 数学——Euler方法求解微分方程详解(python3)

    算法的数学描述图解 实例 用Euler算法求解初值问题 \[ \frac{dy}{dx}=y+\frac{2x}{y^2}\] 初始条件\(y(0)=1\),自变量的取值范围\(x \in [0, 2 ...

  4. lxml的使用

    from urllib import request from lxml import etree # url = '''http://bangumi.tv/anime/browser?sort=ra ...

  5. shell脚本8--录制终端会话

    准备: script -t 2> timing.log -a output.session type commands; ... . .. exit 回放: scriptreplay timin ...

  6. Django——权限

    在models中为user添加权限,permissions第二个参数可指定权限的别名 创建的各种用户user保存在auth_user表中 创建的各种用户user的对应权限permission_id保存 ...

  7. phpExcel导入大数据量情况下内存溢出解决方案

    PHPExcel版本:1.7.6+ 在不进行特殊设置的情况下,phpExcel将读取的单元格信息保存在内存中,我们可以通过 PHPExcel_Settings::setCacheStorageMeth ...

  8. java第二周的学习知识

    1.java基本运行单位是类,类的组成成员为成员变量和方法.成员变量的种类有public,default(就是不写),protected,private.public:public可以修饰类,数据成员 ...

  9. hdu 6034 B - Balala Power! 贪心

    B - Balala Power! 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6034 题面描述 Talented Mr.Tang has n st ...

  10. pygame-KidsCanCode系列jumpy-part12-platform图片

    目前为止,Player的站立.行走.跳跃都是动画了,只有跳板(即:Platform类)还是难看的矩形,这节我们把Platform也换成图片: 原来的Platform类长这个样子: class Plat ...