个人感觉前端不行,好多东西记不住,所以只能将遇到的坎以及解决方案记录下,方便以后用到时查找。

首先: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 实现导出文件-支持批量的更多相关文章

  1. .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件

    asp.net mvc请移步 mvc文件上传支持批量上传,拖拽以及预览,文件内容校验 本篇内容主要解决.net core中文件上传的问题  开发环境:ubuntu+vscode 1.导入所需要的包:n ...

  2. 使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器

    使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器 ajax上传主要使用了 var reader = new FileReader() 此方法 js图片压缩主要是利用canvas进 ...

  3. asp.net 域名注册查询接口 支持批量后缀查询

    最近在完成公司网站www.xuhongkj.com的时候,需要用到域名查询的功能,网上查了一些资料,几乎都是ASP版的,而且功能有限,不能满足我的要求. 百度后,结合网上的例子,整理出了该功能! as ...

  4. API Studio 5.1.2 版本更新:加入全局搜索、支持批量测试API测试用例、读取代码注解生成文档支持Github与码云等

    最近在EOLINKER的开发任务繁重,许久在博客园没有更新产品动态了,经过这些日子,EOLINKER又有了长足的进步,增加了更多易用的功能,比如加入全局搜索.支持批量测试API测试用例.读取代码注解生 ...

  5. [原创]开源跨平台大型网络端口扫描器K8PortScan(支持批量A段/B段/C段/IP列表)

    0x000 K8PortScan Python版Cscan端口扫描器 Code: https://github.com/k8gege/K8PortScan K8portScan 1.0 Date: 2 ...

  6. django与ajax:ajax结合sweetalter ,批量插入数据 ;分页器组件

    目录 一.ajax结合sweetalter 二.bulk_create批量插入数据 三.简易版分页器推导 1. 推导步骤 四.自定义分页器的使用 1. 自定义分页器模板 2. 使用方法 (1)后端代码 ...

  7. mvc文件上传支持批量上传,拖拽以及预览,文件内容校验等

    使用bootstrap-fileinput 使用方式: 1.nuget:Install-Package bootstrap-fileinput 2.语言本地化{下载fileinput_locale_z ...

  8. Spring MVC Ajax 复杂参数的批量传递

    要解决的问题: 如何组织客户端参数? Ajax 方法的配置属性如何定义才能传递复杂参数? 基于 SpringMVC 的服务端该如何接收? MyBatis 怎么处理批量更新? 客户端脚本 viewMes ...

  9. MongoDB不支持批量插入

    mongodb的结构与关系型数据库不同,它类似树状结构,可以很方便对每个分支进行操作,但它没有像mysql那样insert(value.value.value...)那样的语法,也不支持transac ...

随机推荐

  1. Delphi XE2_XE3 Update

    Delphi 和 C++Builder XE2 更新摘要 XE2的关键特性如下: 1. FireMonkey Application Platform支持运行在Windows (32和64位),Mac ...

  2. 3.css3中多个背景图片的用法

    (background-clip裁剪,background-position位置,background-origin定位,background-repeat是否重复) <!DOCTYPE htm ...

  3. String.IsNullOrEmpty官方示例

    // This example demonstrates the String.IsNullOrEmpty() method using System; class Sample { public s ...

  4. Linux 开机自动启动脚本

    1)编写要执行脚本的sh文件mysetup.sh #!/bin/sh ### BEGIN INIT INFO # Provides: land.sh # Required-start: $local_ ...

  5. bzoj3011 [Usaco2012 Dec]Running Away From the Barn 左偏树

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3011 题解 复习一下左偏树板子. 看完题目就知道是左偏树了. 结果这个板子还调了好久. 大概已 ...

  6. 前端之JQuery:JQuery属性操作

    Jquery2--属性相关的操作 知识点总结 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个参数是设置属性 ...

  7. ESP8266-利用网页控制ESP8266

    说明:发出/gpio/1   就输出 "亮灯":   /gpio/0  就输出 "灭灯"  #include <ESP8266WiFi.h> con ...

  8. B1011. A+B 和 C

    题目描述 给定区间[-2^63, 2^63]内的三个整数A.B 和 C,请判断A+B是否大于C 输入格式 第一行给出正整数T(≤10),即测试用例的个数.随后给出T组测试用例,每组占一行,顺序给出A. ...

  9. 【leetcode】Reaching Points

    题目如下: A move consists of taking a point (x, y) and transforming it to either (x, x+y) or (x+y, y). G ...

  10. Oracle12c RAC RMAN异机恢复

    ######################################################## #编辑pfile文件initspdb.ora vi /oracle/app/oracl ...