用ajax下载字节流形式的excel文件
原因: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文件的更多相关文章
- ajax发送请求下载字节流形式的excel文件
背景 开发项目中导出功能,因为数据量有点大,所以导出可能需要时间有点长,所以想用ajax异步请求. 存在问题 利用传统的js和jquery提供的ajax相关获取响应的方式是无法实现excel文件下载的 ...
- 【ABAP系列】SAP ABAP下载带密码的Excel文件
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP下载带密码的Ex ...
- jQuery+php+ajax+PHPExcel实现上传excel文件导入数据库
项目中需要批量导入数据,感觉这个需求以后也会经常用,必须总结分享下: 引入jquery的第三方表单插件: <scripttype="text/javascript&qu ...
- IE浏览器下载后台返回的Excel文件,报错400
问题描述(见下图): 问题分析: 400是后端没有接收到请求 原因是后端高版本的tomcat不会自动对字符串进行转义 所以,前端把参数值进行转义,即encodeURI(string) 问题处理前代码( ...
- ASP.NET读取EXCEL文件的三种经典方法(转)
1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:public DataSet ExcelToDS(string Path) { str ...
- ASP.NET读取EXCEL文件的三种经典方法
1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { ...
- JXL包大解析;Java程序生成excel文件和解析excel文件内容
最近需求变化,需要把excel导入 我以前没有做过,所以我查了一些资料 和参考别人的代码 以下是多种方式: import java.io.File; import java.io.FileInputS ...
- C# 读取EXCEL文件的三种经典方法
1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { stri ...
- asp.net读取excel文件多种方法
asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取. 方法一:采用OleDB读取Excel文件 把Excel文件 ...
随机推荐
- Xamarin Essentials教程发送邮件Email
Xamarin Essentials教程发送邮件Email 邮件是一种更为灵活的数据分享方式.它可以帮助用户将一个应用程序的数据分享给其他用户,而其他用户不需要安装特定的应用程序,就可以在任意时间 ...
- z-index使用及一定要加backgroun
代码: <div> <span style="display:block;width:40px;height:20px;border:1px solid red;posit ...
- Java笔记(九)EnumMap & EnumSet
EnumMap & EnumSet 一.EnumMap 一)基本用法 public static Map<Size, Integer> countBySize(List<Cl ...
- 错误解决记录------------mysql连接本地数据库显示"can't get hostname for your address"
mysql连接本地数据库遇到 can't get hostname for your address 不明原因的本地mysql数据库连接不上,总是显示can't get hostname for yo ...
- error :expected initializer before
很可能头文件或者前面的某个定义少了个:
- Java几种常见的编码方式
几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言 ...
- 单向LSTM笔记, LSTM做minist数据集分类
单向LSTM笔记, LSTM做minist数据集分类 先介绍下torch.nn.LSTM()这个API 1.input_size: 每一个时步(time_step)输入到lstm单元的维度.(实际输入 ...
- tablespace(表空间) / segment(断) / extent(盘区)/ block(块)/datafile(文件)之间的关系
tablespace(表空间) / segment(断) / extent(盘区)/ block(块)之间的关系 tablespace : 一个数据库划分为一个或多个表逻辑单位,即表空间,每个表空 ...
- [Java代码] Java用pinyin4j根据汉语获取各种格式和需求的拼音
pinyin4j是一个功能强悍的汉语拼音工具包,主要是从汉语获取各种格式和需求的拼音,功能强悍,下面看看如何使用pinyin4j.下面介绍用pinyin4j来做的一个根据汉语获取各种格式和需求的拼音d ...
- .Net转Java.06.字符串的split的区别
在Java遇到了将类似“1|2|3|4”的字符串分隔为数组的功能 这种问题能难倒有着十多年开发经验的的.NET码农? // Java代码 String s="1|2|3"; Str ...