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

首先: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. IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass(); 时,报COMException

    解决办法: 在Program.cs的Main函数中添加如下代码: ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop);

  2. pandas 常规操作大全

    那年夏天抓住了蝉的尾巴 gitbook 前言 pandas 抓住 Series (排序的字典), DataFrame (row + 多个 Series) 对象 , 就如同 numpy 里抓住 ndar ...

  3. Apple Pay接入详细教程

    Apple Pay接入详细教程   来源:Yasin的简书 链接:http://www.jianshu.com/p/738aee78ba52# Apple Pay运行环境:iPhone6以上设备,操作 ...

  4. Django模板层2

    一.单表操作 1.1 开启test from django.test import TestCase import os # Create your tests here. if __name__ = ...

  5. MIT-线性代数公开课

    本博客是学习MIT-线性代数笔记,Gilbert Strang大神讲的通俗易懂,感兴趣的可以观看视频 其中习题集请点击 01)方程组的几何解释 02)矩阵消元 03)乘法和逆矩阵 04)A的LU分解 ...

  6. [转载]ISE中COE与MIF文件的联系与区别

    原文地址:ISE中COE与MIF文件的联系与区别作者:铁掌北京漂 在ISE中,当用Blcok Memory Generator 生成某个ROM模块时,经常要对ROM中的内容作初始化.这时,就需要我们另 ...

  7. vue,一路走来(17)--vue使用scss,并且全局引入公共scss样式

    最近朋友问如何在vue项目中使用scss样式,想起之前项目是直接在main.js直接import css文件的,然而main.js不可以直接import scss文件. import './asset ...

  8. 值栈ValueStack的原理与生命周期

    1.ValueStack贯穿整个 Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一样.当Struts2接受一个请求时,会迅速创建ActionCo ...

  9. gitpython 操作

    gitpython 获取仓库远程分支 https://blog.csdn.net/laiyaoditude/article/details/86218508 python操作git https://w ...

  10. Ldap 从入门到放弃(二)

    OpenLDAP 服务器安装与配置 本文内容是自己通过官网文档.网络和相关书籍学习和理解并整理成文档,其中有错误或者疑问请在文章下方留言. 一.概述 本文以Centos 6.8(64bit)为例介绍 ...