java实现导出数据为zip压缩文件
作者:杞人何忧
这篇文章主要为大家详细介绍了java如何实现导出数据为zip压缩文件,并且解压后为json文件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
1,前端只要将要导出的数据的ids传回后端就行了
比如
handleExportApp(row) { const ids = row ? [row.id] : this.checkedRows.map(v => v.id); //exportApp为后端导出接口 exportApp(ids.join(",")); },
2.后端接口
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("系统异常"); } }
但是这样有一个不好的地方,就是前端用户体验感不是很好,需要等待前端一个个文件导出。
到此这篇关于java实现导出数据为zip压缩文件的文章就介绍到这了,更多相关java数据导出为zip内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!