Ajax 实现导出文件-支持批量
个人感觉前端不行,好多东西记不住,所以只能将遇到的坎以及解决方案记录下,方便以后用到时查找。
首先:ajax不支持流,网上找了好多版本,感觉下面的方案不错,实验了下可行。
前端页面:
<div class="div-tbl">
<h1></h1>
<div class="div-btn">
<button id="commitClo" class="btn btn-primary">Commit</button>
<button id="testCommit" class="btn btn-primary">Test</button>
</div>
</div> <script>
$("#testCommit").on("click",function(){
var testData = {
"owner": "FIXDATA",
"tableName": "L_TBL_USER",
"tableDescribe": "用户表",
"autoFlag": "Yes",
"columnList": [{
"columnName": "id",
"columnDescribe": "",
"columnType": "varchar2(30)",
"columnNullFlag": "No",
"defaultVal": ""
}, {
"columnName": "name",
"columnDescribe": "",
"columnType": "VARCHAR2(30)",
"columnNullFlag": "No",
"defaultVal": ""
}, {
"columnName": "age",
"columnDescribe": "",
"columnType": "number(2)",
"columnNullFlag": "No",
"defaultVal": ""
}],
"inxList": [{
"owner": "FIXDATA",
"tableName": "L_TBL_USER",
"inxColumnNames": "id",
"indexType": "1"
}],
"grtList": [{
"owner": "FIXDATA",
"tableName": "L_TBL_USER",
"roleName": "chen",
"operateArr": "select,insert,update,delete"
}]
}; $.ajax({
type: "post",
url: "/export/orcSql", //向后端请求数据的url
data: JSON.stringify(testData) ,
dataType:"text",//返回数据类型
//默认application/x-www-form-urlencoded;charset=UTF-8
//springmvc @RequestBody注解做提交json字符串自动绑定到pojo入参时
contentType: "application/json;charset=UTF-8",
success: function (data) {
var jsonData = JSON.parse(data);
if(jsonData["result"] === "1"){
batchDownLoadFile(jsonData["body"]);
} },error:function (data) {
console.log(2222);
}
});
});
</script>
自定义js:
/**
* AJAX导出文件测试
* @param obj
*/
function ajaxExportFileTest(obj) {
$.ajax({
url : "ajaxExportFileTest",
type : "post",
success : function (result) {
if (result){
let filename = "ceshi.xlsx";
let blob = getBlob(result,{type: "application/vnd.ms-excel"});
let isDown = true;
let url = downloadBlob(filename,blob,isDown);
console.log(url);
}
}
}); } /**
* 获取Blob
* @param base64 base64字符串
* @param contentType 导出格式 MIME 类型
* @param sliceSize 分割大小
* @returns {Blob}
*/
function getBlob(base64, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512; let byteCharacters = atob(base64);
let byteArrays = []; for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
let slice = byteCharacters.slice(offset, offset + sliceSize); let byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
} let byteArray = new Uint8Array(byteNumbers); byteArrays.push(byteArray);
} return new Blob(byteArrays, {type: contentType});
} /**
* 下载文件
* @param fileName 文件名
* @param blob BLOB对象
* @param isDown 是否下载,默认不下载
* @returns {string} 返回url
*/
function downloadBlob(fileName, blob,isDown){
//默认不下载,返回url
//判断是直接下载还是返回对应的URL
let url = URL.createObjectURL(blob);
if (isDown){
//如果是直接下载,利用a标签来实现下载
let docEle = document;
let link = docEle.createElement("a");
link.innerHTML = fileName;
link.download = fileName;
link.href = url;
docEle.getElementsByTagName("body")[0].appendChild(link);
link.click();
$(link).remove();
}
return url;
} function batchDownLoadFile(objArr){
$.each(objArr,function(key,val){
downLoadFile(val["fileName"],val["content"]);
})
} function downLoadFile(fileName,content){
let blob = getBlob(content,{type: "application/octet-stream"});
let isDown = true;
let url = downloadBlob(fileName,blob,isDown);
}
后端实现:
package com.example.demo.controller; import com.example.demo.dto.TableDto;
import com.example.demo.service.TestService;
import com.example.demo.util.CommonCollectionUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; @Controller
@RequestMapping("/export")
public class ExportController { @Resource
private TestService testService; @ResponseBody
@RequestMapping(value = "/orcSql",method = RequestMethod.POST)
public Map<String, Object> export(@RequestBody TableDto dto, HttpServletResponse response) throws IOException {
System.out.println(dto); response.setStatus(HttpStatus.OK.value()); Map<String, Object> resultMap = CommonCollectionUtils.newHashMapInstance(); List<Map<String,String>> bodyList = new ArrayList<Map<String,String>>();
Map<String,String> fileMap1 = CommonCollectionUtils.newHashMapInstance();
fileMap1.put("fileName","11111.sql");
fileMap1.put("content",testService.exportExcelFileBase64Str("Hello,1111")); Map<String,String> fileMap2 = CommonCollectionUtils.newHashMapInstance();
fileMap2.put("fileName","2222.sql");
fileMap2.put("content",testService.exportExcelFileBase64Str("Hello,2222")); bodyList.add(fileMap1);
bodyList.add(fileMap2); resultMap.put("result","1");
resultMap.put("body",bodyList); return resultMap;
} @PostMapping(value = "/ajaxExportFileTest")
@ResponseBody
public String ajaxExportFileTest(HttpServletResponse response){
response.setStatus(HttpStatus.OK.value());
return testService.exportExcelFileBase64Str("Hello,Heoo!");
}
}
测试:

Ajax 实现导出文件-支持批量的更多相关文章
- .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件
asp.net mvc请移步 mvc文件上传支持批量上传,拖拽以及预览,文件内容校验 本篇内容主要解决.net core中文件上传的问题 开发环境:ubuntu+vscode 1.导入所需要的包:n ...
- 使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器
使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器 ajax上传主要使用了 var reader = new FileReader() 此方法 js图片压缩主要是利用canvas进 ...
- asp.net 域名注册查询接口 支持批量后缀查询
最近在完成公司网站www.xuhongkj.com的时候,需要用到域名查询的功能,网上查了一些资料,几乎都是ASP版的,而且功能有限,不能满足我的要求. 百度后,结合网上的例子,整理出了该功能! as ...
- API Studio 5.1.2 版本更新:加入全局搜索、支持批量测试API测试用例、读取代码注解生成文档支持Github与码云等
最近在EOLINKER的开发任务繁重,许久在博客园没有更新产品动态了,经过这些日子,EOLINKER又有了长足的进步,增加了更多易用的功能,比如加入全局搜索.支持批量测试API测试用例.读取代码注解生 ...
- [原创]开源跨平台大型网络端口扫描器K8PortScan(支持批量A段/B段/C段/IP列表)
0x000 K8PortScan Python版Cscan端口扫描器 Code: https://github.com/k8gege/K8PortScan K8portScan 1.0 Date: 2 ...
- django与ajax:ajax结合sweetalter ,批量插入数据 ;分页器组件
目录 一.ajax结合sweetalter 二.bulk_create批量插入数据 三.简易版分页器推导 1. 推导步骤 四.自定义分页器的使用 1. 自定义分页器模板 2. 使用方法 (1)后端代码 ...
- mvc文件上传支持批量上传,拖拽以及预览,文件内容校验等
使用bootstrap-fileinput 使用方式: 1.nuget:Install-Package bootstrap-fileinput 2.语言本地化{下载fileinput_locale_z ...
- Spring MVC Ajax 复杂参数的批量传递
要解决的问题: 如何组织客户端参数? Ajax 方法的配置属性如何定义才能传递复杂参数? 基于 SpringMVC 的服务端该如何接收? MyBatis 怎么处理批量更新? 客户端脚本 viewMes ...
- MongoDB不支持批量插入
mongodb的结构与关系型数据库不同,它类似树状结构,可以很方便对每个分支进行操作,但它没有像mysql那样insert(value.value.value...)那样的语法,也不支持transac ...
随机推荐
- 【ES6】迭代器与可迭代对象
ES6 新的数组方法.集合.for-of 循环.展开运算符(...)甚至异步编程都依赖于迭代器(Iterator )实现.本文会详解 ES6 的迭代器与生成器,并进一步挖掘可迭代对象的内部原理与使用方 ...
- 细说C#的ReferenceEquals,Equals和==比较运算符
C# 中有两种不同的相等:引用相等和值相等.值相等是大家普遍理解的意义上的相等:它意味着两个对象包含相同的值.例如,两个值为 2 的整数具有值相等性.引用相等意味着要比较的不是两个对象,而是两个对象引 ...
- CentOS7.6下设置mysql服务开机启动
在centos7中所有对服务的管理都集中到了systemctl当中,所以服务的启动.关闭.重启.开机启动等等的操作都可以用systemctl. systemctl对服务的管理都是通过配置文件,配置文件 ...
- ntsysv - 用于配置运行级别的简单接口
总览 SYNOPSIS ntsysv [--back] [--level <levels>] 描述 DESCRIPTION ntsysv 是个用于配置运行级别服务(也可通过 chkconf ...
- json反序列化与pickle的用法
json反序列化与pickle 一.定义 序列化:将内存中的不可持久化和传输对象转换为可方便持久化和传输对象的过程. 反序列化:将可持久化和传输对象转换为不可持久化和传输对象的过程. 二. 应用场景 ...
- 工作中常用到的linux命令总结
linux系统ubantu debian系统下载文件:wget https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0 ...
- python3-使用模块
Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env python3 # -*- c ...
- BOM-window
窗口位置 screenLeft和screenTop screenLeft 和 screenTop 属性,分别用于表示窗口相对于屏幕左边和上边的位置.Firefox 则在screenX 和 screen ...
- python-抽象类和抽象方法
需要模块 import abc 抽象类不能实例化 import abc class Animal(metaclass=abc.ABCMeta): #抽象类 @abc.abstractmethod # ...
- vue安装iview和配置
在命令行工具上输入:npm install iview --save 等待安装完成. 在项目的src/main.js中添加三行代码引入iview import iView from 'iview' i ...