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

首先: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. 服务器上部署django项目流程?

    1. 简单粗暴 项目开发完毕,在部署之前需要再配置文件中将 ALLOWED_HOSTS配置设置为:当前服务器IP或*,如: ALLOWED_HOSTS = ["*",] 然后将源码 ...

  2. CSUST 8.4 早训

    ## Problem A A - Memory and Crow CodeForces - 712A 题意: 分析可得bi=ai+ai+1 题解: 分析可得bi=ai+ai+1 C++版本一 #inc ...

  3. django编辑框实现

    一些常用的: CKEditor UEEditor TinyEditor KindEditor 下载: http://kindeditor.net/down.php 使用方法: <textarea ...

  4. java复习(4)异常

    1.Java异常的分类和类结构图 1.Throwable是整个java异常体系的超类,所有的异常类都派生自这个类,包含Error和Exception这两个直接的子类,概括了所有能被当做异常跑出来的东西 ...

  5. npm发布包

    一.发布一个新包第一步:进入要发布的项目根目录,初始化为npm包: npm init 依次按提示填入包名.版本.描述.github地址.关键字.license等 这步完成之后会生成一个package. ...

  6. 安装sysbench,报错"Could not resolve 'ports.ubuntu.com'"

    在ubuntu系统中安装sysbench时报错“Could not resolve 'ports.ubuntu.com'”怎么办呢? 安装时报错: 亲测可用的方法: 修改 resolv.conf 文件 ...

  7. media(上传的文件或图片路径配置)

    urls url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}), settings MED ...

  8. Qt项目界面文件(.ui)及其作用(超详细)

    http://c.biancheng.net/view/1820.html Qt 项目中,后缀为“.ui”的文件是可视化设计的窗体的定义文件,如 widget.ui.双击项目文件目录树中的文件 wid ...

  9. Android相关资源

    各类黑客大会资料 https://infocon.org/cons/ 各类课程.视频 https://github.com/Developer-Y/cs-video-courses#security ...

  10. AGC009题解

    为了1天4题的flag不倒所以开新坑... B. 考虑把这棵树直接建出来,f[i]表示i最少的比赛次数,然后按照定义转移就行了. //Love and Freedom. #include<cst ...