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 ...
随机推荐
- 自动清理ES索引脚本
#/bin/bash #指定日期(3个月前) DATA=`date -d "3 month ago" +%Y.%m.%d` #当前日期 time=`date` #删除3个月前的日志 ...
- gulp程序怎么跑起来 及 使用中遇到的常见错误
gulp常见问题 问题一:Error: cannot find module 'gulp-concat' #16 解答:需要先npm install,然后执行gulp gulp安装及使用 一.安装no ...
- vuex实现数据共享
1.store.js结构 import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Sto ...
- python之模块导入和包
一.何为模块 1.一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.模块目的和函数,对象等一样,是为了代码的复用性而存在的.即一个py程序写了很多功能,也可 ...
- Educational Codeforces Round 55 (Rated for Div. 2) B. Vova and Trophies (贪心+字符串)
B. Vova and Trophies time limit per test2 seconds memory limit per test256 megabytes inputstandard i ...
- mysql 练习笔记
从一个数据表中找出连续n条满足条件的记录 例子demo 从数据表中找出连续三条或者三次以上分数超过80分的记录 MariaDB [testdatabase]> select * from cla ...
- web页面调用app的方法
use_app_goto_page: (skip_type, skip_target) => { // Android App if (/android/i.test(navigator.use ...
- IO操作基本步骤
package com.study02; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundE ...
- SpringCloud学习系列-构建部门微服务消费者Module
1.新建microservicecloud-consumer-dept-80 2.Pom <project xmlns="http://maven.apache.org/POM/4.0 ...
- Git 回滚操作之 revert
https://blog.csdn.net/HobHunter/article/details/79462899 https://blog.csdn.net/secretx/article/detai ...