Ajax异步请求返回文件流(eg:导出文件时,直接将导出数据用文件流的形式返回客户端供客户下载)
在异步请求中要返回文件流,不能使用JQuery,因为$.ajax,$.post 不支持返回二进制文件流的类型,可以看到下图,dataType只支持xml,json,script,html这几种格式,没有blob类型。所以只能选择使用原生Ajax XMLReques对象进行处理
前端代码
function output() {
var branchCode = $("#currentBranchCode").val();
var transDate = $("#currentTransDate").val();
if (branchCode == "" || transDate == "") {
layer.msg("暂无记录,无法导出", { icon: 7, time: 1000 });
return;
}
var fileName = $("table caption").html() + ".xls";//设置下载时候的文件名
//要请求的Url和携带的参数
var url = "/SellAnalyze/Export?currentBranchCode=" + branchCode + "¤tTransDate=" + transDate;
var xhr = new XMLHttpRequest();
//设置响应类型为blob类型
xhr.responseType = "blob";
xhr.onload = function () {
if (this.status == "200") {
//获取响应文件流
var blob = this.response;
var aElem = document.getElementById("exportUrl");
//将文件流保存到a标签
aElem.href = window.URL.createObjectURL(blob);
aElem.download = fileName;
aElem.onload = function (e) {
window.URL.revokeObjectURL(aElem.href);
};
$("#exportUrl").removeClass("hidden");
layer.confirm('文件已导出, 立即下载?', function (index) {
$("#download").click(); layer.close(index);
});
}
} xhr.open("post", url, true);
xhr.send();
}
后端代码
public ActionResult Export(int? currentBranchCode, DateTime currentTransDate)
{
MemoryStream ms = NPOIExcelWrite(datas);
ms.Seek(0, SeekOrigin.Begin);
return File(ms, "application/vnd.ms-excel");
} /// <param name="datas">写入的数据</param>
/// <returns></returns>
private MemoryStream NPOIExcelWrite(SellDTO[] datas)
{
string[] titles = { "货品类别", "货品类别描述", "销售额", "同比", "环比" };
NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
NPOI.SS.UserModel.ISheet sheet = book.CreateSheet("Sheet1");
NPOI.SS.UserModel.IRow row = sheet.CreateRow();
for (int i = ; i < titles.Length; i++)
{
row.CreateCell(i).SetCellValue(titles[i]);
}
for (int i = ; i < datas.Length; i++)
{
row = sheet.CreateRow(i + );
row.CreateCell().SetCellValue(datas[i].JewelryType);
row.CreateCell().SetCellValue(datas[i].JewelryTypeDesc);
row.CreateCell().SetCellValue(datas[i].CurrentMonthSaleroom.ToString("F2"));
row.CreateCell().SetCellValue(datas[i].YearOverYear);
row.CreateCell().SetCellValue(datas[i].LinkRelative);
} MemoryStream ms = new MemoryStream();
book.Write(ms);
ms.Flush();
book = null;
return ms;
}
参考:https://blog.csdn.net/swl979623074/article/details/77855629/
https://www.cnblogs.com/cdemo/p/5225848.html
https://blog.csdn.net/fangchen12312/article/details/55271296
Ajax异步请求返回文件流(eg:导出文件时,直接将导出数据用文件流的形式返回客户端供客户下载)的更多相关文章
- maven工程 java 实现文件上传 SSM ajax异步请求上传
java ssm框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件 首先springmvc的配置文件要配置上传文件解析器: <!- ...
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- 09.VUE学习之watch监听属性变化实现类百度搜索栏功能ajax异步请求数据,返回字符串
cmd下安装axios npm install axios 安装好后,会多出node_modules文件夹 思路: 监听data里的word改变时,发送ajax异步请求数据, 把返回的数据赋值给dat ...
- jquery的ajax异步请求接收返回json数据
http://www.jb51.net/article/51122.htm jquery的ajax异步请求接收返回json数据方法设置简单,一个是服务器处理程序是返回json数据,另一种就是ajax发 ...
- ajax异步请求返回对象
使用ajax异步请求返回一个对象. java code: @RequestMapping({"getAstSingleWheelImg_bbs"+Constant.JSON}) @ ...
- ajax异步请求
做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...
- jquery Ajax异步请求之session
写了一个脚本,如下: $(function () { $("#btnVcode").click(function () { var receiveMobile = $(" ...
- 关于我们ajax异步请求的方法与知识
做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school ...
- Ajax -异步请求 -jquery中ajax分类 -第一层 $.ajax -第二层($.get /$.post) -第三层($.getJson/$.getScript) -相应演示
Ajax 1.标准请求响应时浏览器的动作(同步操作) 1.1浏览器请求什么资源,跟随显示什么资源2.ajax:异步请求. 2.1局部刷新,通过异步请求,请求到服务器资源数据后,通过脚本修改页面中部分内 ...
随机推荐
- div+css做出带三角的弹出框 和箭头
一.三角形 https://blog.csdn.net/Szu_AKer/article/details/51755821 notice:三角的那部分可以用图片作为背景,但是容易出现杂边.所以利用cs ...
- Rabbit给单独的消息设置超时
/** * 发送消息 * @param user */@RequestMapping(value = prefix+"/setRabbitMessage", method = Re ...
- 浅谈Java集合体系及底层实现原理
集合加载因子 https://blog.csdn.net/qq_34627002/article/details/79769261 底层原理: https://blog.csdn.net/qq_258 ...
- man hdparm
HDPARM(8) HDPARM(8) NAME hdparm - 获 ...
- Linux学习-MySQL的高可用性集群Galera Cluste
一.Galera Cluste简介 1.Galera Cluster 集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版 ...
- maven构建docker镜像异常
由于没有配置ip+2375端口,导致每次跑的时候,都是连接本地的,一直会报错 [ERROR] Failed to execute goal com.spotify:docker-maven-plugi ...
- Cluster基础(四):创建RHCS集群环境、创建高可用Apache服务
一.创建RHCS集群环境 目标: 准备四台KVM虚拟机,其三台作为集群节点,一台安装luci并配置iSCSI存储服务,实现如下功能: 使用RHCS创建一个名为tarena的集群 集群中所有节点均需要挂 ...
- vue双向数据绑定对于数组和新增对象属性不能监听的解决办法
出现数组不能按照索引进行跟新的原因是处于性能考虑的,但是整体数组的增加删除是可以监听到的:对于对象新增属性不能监听是因为没有在生成vue实例时候放进watcher收集依赖. 首先我们先来了解vue数据 ...
- JavaScript fetch接口
JavaScript fetch接口 如果看网上的fetch教程,会首先对比XMLHttpRequest和fetch的优劣,然后引出一堆看了很快会忘记的内容(本人记性不好).因此,我写一篇关于fetc ...
- LintCode之最长单词
题目描述: 分析:先建一个数组s用来存储每个字符串的长度,然后遍历数组s得到最大的数max,这个数就是词典中的最长单词的长度,由于可能有多个长度相等的单词,所以要循环整个词典,当一个单词的长度等于ma ...