导出数据为zip压缩文件,解压后为json文件

  1. 前端只要将要导出的数据的ids传回后端就行了

比如

    handleExportApp(row) {const ids = row ? [row.id] : this.checkedRows.map(v => v.id); //exportApp为后端导出接口exportApp(ids.join(","));},
  1. 后端接口
    public void exportApp(String ids, HttpServletResponse response) {if (StringUtils.isBlank(ids)) {throw new BusinessException("参数不能为空");}List<String> idsList = Arrays.asList(ids.split(","));List<App> list = appService.findAppAllListByIds(idsList);//创建HttpServerResponse的输出流OutputStream out = null;try {out = response.getOutputStream();BufferedInputStream bis;File file = new File("应用数据包.zip");//通过ZipOutputStream定义要写入的对象ZipOutputStream zos = null;zos = new ZipOutputStream(new FileOutputStream(file));writeZos(list, zos);zos.close();//定义返回类型response.setContentType("text/html; charset=UTF-8");response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode("应用数据包.zip", "UTF-8"))));bis = new BufferedInputStream(new FileInputStream(file));//定义byte,长度就是要转成zip文件的byte长度,避免浪费资源byte[] buffer = new byte[bis.available()];bis.read(buffer);out.flush();out.write(buffer);file.delete();} catch (IOException e) {logger.error("应用数据包流写入异常{}", e.getMessage());throw new BusinessException("系统异常");} finally {if (out != null) {try {out.close();} catch (IOException e) {e.printStackTrace();}}}}public void writeZos(List<App> list, ZipOutputStream zos) {list.forEach(a -> {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();try {byteArrayOutputStream.write(JSONUtil.toJsonStr(a).getBytes());zos.putNextEntry(new ZipEntry(a.getName() + ".json"));byte[] excelStream = byteArrayOutputStream.toByteArray();zos.write(excelStream);zos.closeEntry();} catch (IOException e) {logger.error("应用数据包流写入异常{}", e.getMessage());throw new BusinessException("系统异常");}});}

拓展
如果只是导出json文件,不需要压缩包的话
前端

    handleExportApp(row) {this.ids = row ? [row.id] : this.checkedRows.map(v => v.id);this.loading = true;this.exportData(this.ids);},exportData(ids) {if (ids.length > 0) {const currentId = ids.shift(); // 取出数组中的第一个idsimulateClick(exportApp(currentId)); // 导出单个数据setTimeout(() => {this.exportData(ids); // 递归调用导出函数,继续下一个数据}, 10000); // 设置递归的间隔时间,以免处理过多数据造成性能问题}},

后端

        if (StringUtils.isBlank(ids)) {throw new BusinessException("参数不能为空");}List<String> idsList = Arrays.asList(ids.split(","));for (String id : idsList) {App app = appService.getById(id);// 忽略未找到的应用程序if (app == null) {continue;}ObjectMapper objectMapper = new ObjectMapper();try {//把对象转成json字符串String jsonString = objectMapper.writeValueAsString(app);// 设置响应头部信息response.setContentType("application/json");response.setCharacterEncoding("UTF-8");response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode("应用_" + app.getName() + ".json", "UTF-8"))));// 获取输出流并写入JSON字符串PrintWriter writer = response.getWriter();writer.write(jsonString);writer.flush();writer.close();} catch (IOException e) {logger.error("导出应用数据异常:{}", e.getMessage());throw new BusinessException("系统异常");}}

但是这样有一个不好的地方,就是前端用户体验感不是很好,需要等待前端一个个文件导出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/135153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【mysql】CommunicationsException: Communications link failure

CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 通信异常&#xff1a;通信链路故障 最后一个成功发送到服务器的数据包是0毫秒前…

数据结构-双向链表

目录 1.带头双向循环链表&#xff1a; 2. 带头双向循环链表的实现&#xff1a; 双向链表初始化&#xff1a; 双向链表打印&#xff1a; 开辟节点函数&#xff1a; 双向链表头插&#xff1a; 双向链表尾插&#xff1a; 双向链表头删&#xff1a; 双向链表尾删&#xff…

HMM与LTP词性标注之马尔科夫模型(HMM原理剖析)

文章目录 问题描述viterbi算法联合概率与条件概率维特比算法实例 问题描述 viterbi算法 联合概率与条件概率 维特比算法实例

hdlbits系列verilog解答(always块条件语句)-37

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 Verilog 有一个三元条件运算符 ( ? : ) 很像 C语言: (condition ? if_true : if_false) 这可用于根据一行上的条件(多路复用器!)选择两个值之一,而无需在组合 always 块中使用 if-then。 举例: (0…

界面控件DevExpress WPF PDF Viewer,更快实现应用的PDF文档浏览

DevExpress WPF PDF Viewer控件可以轻松地直接在Windows应用程序中显示PDF文档&#xff0c;而无需在最终用户的机器上安装外部PDF查看器。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress…

Channel扇出模式

文章目录 扇出模式reflectSelect 方式 扇出模式 有扇入模式&#xff0c;就有扇出模式&#xff0c;扇出模式是和扇入模式相反的。扇出模式只有一个输入源 Channel&#xff0c;有多个目标 Channel&#xff0c;扇出比就是 1 比目标 Channel 数的值&#xff0c;经常用在设计模式中…

【寒武纪(3)】媒体处理系统的系统控制、视频输入和后处理子系统

系统控制 文章目录 系统控制1、配置视频缓存池Video Pool2、配置硬件IP为在线工作&#xff08;不通过DDR数据交互&#xff09;/ 离线工作&#xff08;写入DDR&#xff09;模式3、硬IP可以使用 非Video Block &#xff08;VB&#xff09;内存4、配置是否启动内存传递的压缩 视频…

【Hadoop】YARN容量调度器详解

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&am…

Redis实战 | 使用Redis 的有序集合(Sorted Set)实现排行榜功能,和Spring Boot集成

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

[架构之路-244]:目标系统 - 设计方法 - 软件工程 - 软件开发方法:结构化、面向对象、面向服务、面向组件的开发方法

目录 前言&#xff1a; 一、概述: 软件聚合的程度由简单到复杂 二、主要开发方法详见 2.1 结构化的开发方法 2.2 面对对象的开发方法 2.3 面向服务的开发方法 2.4 面向组件的开发方法 三、不同开发方法比较 3.1 结构化开发方法 3.2 面向对象(OOP)开发方法 3.3 面向服…

【计算机网络】网络层IP协议

文章目录 1. IP协议介绍2. IP报头3. IP的分片和组装4. IP地址网段划分特殊的IP地址子网、局域网、网段的区别IP地址的数量限制 5. 公网IP和私有IP6. NAT技术7. 路由Route 1. IP协议介绍 IP协议&#xff08;Internet Protocol&#xff09;是一种最常用的网络层协议&#xff0c;…

CSS 边框、轮廓线

一、CSS边框&#xff1a; CSS边框属性允许指定一个元素边框的样式和颜色。 1&#xff09;、边框样式&#xff1a;border-style属性用来定义边框的样式&#xff0c;border-style值&#xff1a; 2&#xff09;、边框宽度&#xff1a;border-width属性用于指定边框宽度。指定变宽…

2023-11-07 C语言链接库编译命令

点击 <C 语言编程核心突破> 快速C语言入门 C语言链接库编译命令 前言一、引入库文件, 包括头文件和lib库二、简单示例总结 前言 要解决问题: 一般没有给新手的链接库编译命令学习资料, 然而, 不解决这个问题, 调用库就能折腾到劝退, 我近日回答一个问题, 很简单, 调用…

【 Docker: 数据卷挂载】

背景 Docker只提供了容器运行的必备依赖&#xff0c;但是一些编辑等操作的依赖是不支持的&#xff0c;如vi操作容器内部文件、将静态资源拷贝到容器内来等。 docker pull nginx docker run -d -p 81:80 --namemynginx -v D:/docker/nginx/www:/usr/share/nginx/www -v D:/dock…

Angular 中的数据交互GET POST

1 Angular get 请求数据 Angular5.x 以后 get、post 和和服务器交互使用的是 HttpClientModule 模块 在 app.module.ts 中引入 HttpClientModule 并注入 import {HttpClientModule} from angular/common/http imports: [ BrowserModule, HttpClientModule ]在用到的地方引入…

柯桥英语培训,商务英语学习,常用口语

欢迎各位小伙伴来到 ——“每个单词我都认识&#xff0c;但我又不认识整个短语”的时候啦&#xff01; “dog”是“狗” “breakfast”是早餐 那“a dogs breakfast”是“狗的早餐”&#xff1f; 狗听了都摇头。 a dogs breakfast是一句英文俚语&#xff0c;指的是无序、混…

要做CMMI认证?什么是CMMI资质认证?

CMMI官方为美国CMMI Institute。CMMI资质主要包括三种&#xff1a;研发模型CMMI for Development资质&#xff0c;服务模型CMMI for Serivce资质&#xff0c;采购模型CMMI for Acquisition资质。在所有已过级企业中有99.5%以上的企业为研发模型CMMI for Development资质&#x…

Evaluating Large Language Models: A Comprehensive Survey

本文是LLM系列文章&#xff0c;针对《Evaluating Large Language Models: A Comprehensive Survey》的翻译。 评估大型语言模型&#xff1a;一项综合调查 摘要1 引言2 分类和路线图3 知识和能力评估4 对齐评估5 安全评估6 专业LLM评估7 评估组织8 未来方向9 结论 摘要 大型语…

LeetCode | 面试题 02.02. 返回倒数第 k 个节点

LeetCode | 面试题 02.02. 返回倒数第 k 个节点 OJ链接 思路&#xff1a;定义两个快慢指针&#xff0c;让快指针先提前走k个节点&#xff0c;然后再让慢结点和快结点一起走&#xff0c;当快指针 NULL时&#xff0c;慢指针就是倒数第k个节点 代码如下&#xff1a; int kthT…

java list set map日子记录

List集合 概念 是一个容器,作用为存放多个数据,通常用来替代数组 特点 只能存放引用类型 所有集合都来自于java.util包 List , Set , Map都是接口 List的存储特点 有序,有下标,元素可以重复 List的常用实现类 ArrayList (常用) JDK1.2 底层数组实现 查询快,增删慢 线程不…