当前位置: 首页 > news >正文

导出数据为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("系统异常");}}

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

相关文章:

  • 6-会话、过滤器、监听器
  • ZZ038 物联网应用与服务赛题第D套
  • 目前为止看过最帅气的一篇论文YOLOv3: An Incremental Improvement(2018.4)
  • Cuda cmake支持C++17
  • 学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令
  • AI:63-基于Xception模型的服装分类
  • 大数据学习之Spark性能优化
  • USB HID在系统下通信的一些总结
  • IP地址修改方法有哪几种
  • C#学习中关于Visual Studio中ctrl+D快捷键(快速复制当前行)失效的解决办法
  • 基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 失物招领小程序 设计与实现
  • 富文本编辑器
  • HDFS系统权限详解
  • source activate my_env 和conda activate my_env 有什么区别
  • AI创作系统ChatGPT商业运营系统源码+支持GPT4/支持ai绘画
  • C++11: atomic 头文件
  • iOS 系统授权开发
  • Java知识点总结(JavaIO-打印流)
  • js 实现textarea输入字数提示
  • js对象的深浅拷贝
  • JWT究竟是什么呢?
  • Kibana配置logstash,报表一体化
  • leetcode388. Longest Absolute File Path
  • linux安装openssl、swoole等扩展的具体步骤
  • maven工程打包jar以及java jar命令的classpath使用
  • nodejs实现webservice问题总结
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • React Native移动开发实战-3-实现页面间的数据传递
  • spring + angular 实现导出excel
  • SQLServer之创建显式事务
  • unity如何实现一个固定宽度的orthagraphic相机
  • 分布式事物理论与实践
  • 检测对象或数组
  • 精彩代码 vue.js
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 使用SAX解析XML
  • 正则表达式小结
  • 7行Python代码的人脸识别
  • MyCAT水平分库
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 容器镜像
  • (c语言)strcpy函数用法
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (剑指Offer)面试题34:丑数
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (算法)N皇后问题
  • (转)Windows2003安全设置/维护
  • (转)编辑寄语:因为爱心,所以美丽
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Project Open Day(2011.11.13)
  • .net 发送邮件
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET企业级应用架构设计系列之结尾篇