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

批量导出字段blob为zip文件

一:导出数据库字段是blob的base64编码后的图片

二:代码

public ResponseEntity<byte[]> exportQrCodes(@RequestBody(required = false)InvoiceSummary invoiceSummary) { try { // 生成ZIP数据 byte[] zipData = exportQrCodesToZip(invoiceSummary); // 生成文件名(带时间戳) String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String fileName = "qrcodes_" + timestamp + ".zip"; String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()) .replaceAll("\\+", "%20"); // 返回文件流,浏览器会自动下载到默认下载文件夹 return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFileName) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(zipData); } catch (Exception e) { return ResponseEntity.internalServerError().build(); } } /** * 批量导出二维码为ZIP包 */ public byte[] exportQrCodesToZip(InvoiceSummary invoiceSummary) { // 查询所有有二维码的数据 startPage(); List<InvoiceSummary> list = invoiceSummaryService.selectInvoiceSummaryList(invoiceSummary); if (CollectionUtils.isEmpty(list)) { throw new RuntimeException("没有找到二维码数据"); } System.err.println("开始导出,共{}张二维码"+ list.size()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ZipOutputStream zos = new ZipOutputStream(baos)) { int successCount = 0; for (InvoiceSummary entity : list) { String base64 = entity.getElectronicTicketQrCode(); if (base64 == null || base64.isEmpty()) { continue; } try { // Base64解码 byte[] imageBytes = Base64.getDecoder().decode(base64); // 添加到ZIP文件 String fileName = "qrcode_" + entity.getId() + ".png"; ZipEntry entry = new ZipEntry(fileName); zos.putNextEntry(entry); zos.write(imageBytes); zos.closeEntry(); successCount++; if (successCount % 100 == 0) { System.err.println("已打包 {} 张"+successCount); } } catch (Exception e) { System.err.println("打包失败 ID: {}"+ entity.getId()); } } System.err.println("打包完成,成功{}张,失败{}张"+ list.size()); } catch (Exception e) { System.err.println("ZIP打包失败"+e); throw new RuntimeException("导出失败", e); } return baos.toByteArray(); }

三:效果

http://www.rkmt.cn/news/1419835.html

相关文章:

  • 容器网络:Docker网络模式与Kubernetes网络
  • 微光暖人心,守护夕阳红
  • 从怀疑到真香!2026年我亲测好用的录音转文字工具真心安利给大家
  • 别再让Tickless只省电!深入FreeRTOS低功耗模式,优化你的IoT设备响应速度与电池寿命
  • YOLO26六种水果实时检测系统,从训练到部署,苹果/香蕉/葡萄/橙子/菠萝/西瓜,7000+图像训练(项目源码+数据集+模型权重+UI界面+python+深度学习+远程环境部署)
  • 从Windows到Linux:给新手小白的第一个命令行生存指南(CentOS 7/RHEL 8)
  • 动态脉冲神经网络在入侵检测中的终身学习应用
  • 宁波市2026年最新黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • AI商业化十字路口:从流量到任务,从注意力到执行经济的转变
  • AI重塑商业沟通协作:从工具到智能伙伴的底层逻辑与实践
  • win10 win11快速安装python 等软件
  • 告别L298N发热!用STM32CubeMX HAL库驱动TB6612控制直流电机(附完整代码)
  • 攀枝花市2026年最新黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • 2026 江苏南通钢结构厂房防水防腐防火隔热公司推荐(OP3 必看・沿海特供版) - 本地便民网
  • 别再让Win10偷跑流量了!手把手教你关闭Delivery Optimization(附任务管理器隐藏技巧)
  • Windows 10/11 上5分钟搞定HFish蜜罐:从下载到登录的保姆级避坑指南
  • Shell脚本高频易错点全面梳理
  • 2026年驻马店市黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 盛世金银回收
  • 视频硬字幕提取终极指南:5分钟掌握本地化AI字幕识别技术
  • 免费Mac工具QMCDecode:三步快速解密QQ音乐加密格式的终极指南
  • 绿色计算技术:数据中心能效提升与可持续发展实践
  • Syncthing同步工具入门踩坑记:Windows下共享文件夹‘设备未连接’问题排查指南
  • 医疗NLP实战指南:从非结构化数据到临床智能决策
  • 律所新员工上手案件管理系统需要多久?从培训成本到落地效率的真实分析
  • 从离子晶体到半导体:一维双原子链振动模型在材料模拟中的实战应用(Python代码示例)
  • 终极炉石传说增强插件HsMod:55项功能全面解析与使用指南
  • 鹤壁市2026年最新黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • 干了十几年硬件测试,终于遇到一台省心的多通道直流电源——洛仪PDS 3000M+系列深度解析
  • 衡水市2026年最新黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • 【LLM基础研究】核心六:AIInfra