导出数据为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(); // 取出数组中的第一个id
        simulateClick(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("系统异常");
            }
        }

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

相关推荐
红叶舞1 天前
成数据绑定对象,在应用程序中处理完数据后,将更新的数据序列化为JSON传回远端服务器,很多移动应用使用了这种模式处理服务器端的数据。 ...
运维·服务器·json
name好难取诶2 天前
解析请求体内容(如 JSON、表单数据、XML 等) 将原始数据转换为 Python 数据结构 使转换后的数据可在 request. ...
xml·python·json
gcw10242 天前
JSONMe 简觅JSON 工具
json·json格式化·json可视化·json美化·json校验·好用的json工具·json编辑
北北牌屈四巴格!2 天前
whistle自定义修改接口返回值内容
前端·json
SQDN3 天前
Chatbox 1.22.1 获取不到模型?先验 /models,再对齐精确 model ID
人工智能·测试工具·机器学习·chatgpt·json
SunnyDays10113 天前
Python 将 Excel(XLS/XLSX)转换为 JSON:导出工作簿、工作表、单元格区域与自定义 JSON 结构
python·json·excel·excel 转 json·导出 excel 到 json·xlsx 转 json·xls 转 json
刘小八3 天前
Spring AI 结构化输出:稳定生成可校验的业务 JSON
人工智能·spring·json
CodexDave4 天前
Python 自动化接单实战(一):把 CSV 需求做成配置驱动解析器
java·python·自动化·json·数据清洗·python自动化·csv处理
今夜有雨.5 天前
C++JSON 解析器
c++·笔记·后端·学习·json
用户657094163305 天前
Kotlin Moshi库 全面使用指南
json