当前位置: 首页 > 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.jsqmd.com/news/908529/

相关文章:

  • 软考网工下午题通关秘籍:一张拓扑图,搞定防火墙、IPS、DMZ所有考点
  • 容器网络:Docker网络模式与Kubernetes网络
  • 从怀疑到真香!2026年我亲测好用的录音转文字工具真心安利给大家
  • 别再让Tickless只省电!深入FreeRTOS低功耗模式,优化你的IoT设备响应速度与电池寿命
  • 从Windows到Linux:给新手小白的第一个命令行生存指南(CentOS 7/RHEL 8)
  • 5万10万30万的MES到底差在哪
  • 教AI如何在“客人”突然暴增时,通过内部“瘦身”和“团队协作”,保证响应速度,避免“宕机”
  • YOLO26六种水果实时检测系统,从训练到部署,苹果/香蕉/葡萄/橙子/菠萝/西瓜,7000+图像训练(项目源码+数据集+模型权重+UI界面+python+深度学习+远程环境部署)
  • 极致创新的抽奖系统:Magpie-LuckyDraw全平台部署实战指南 [特殊字符]
  • Win11文件拖拽卡成PPT?别急着重装,试试这3个隐藏设置(亲测有效)
  • 动态脉冲神经网络在入侵检测中的终身学习应用
  • 2026最新冷静评测3款免费文字转语音在线版实用神器,亲测真香无套路!
  • 宁波市2026年最新黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • 元数据驱动的低代码平台,天生就是本体的矿藏
  • 2026年珠海市黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 盛世金银回收
  • AI赋能销售演示:从知识库构建到实时提示的实战指南
  • 告别pip安装超时:手把手教你用Christoph Gohlke的预编译包搞定netCDF4
  • 如何用AzurLaneAutoScript实现碧蓝航线全自动游戏:5分钟终极指南
  • 微信网页版无法登录?终极解决方案:wechat-need-web浏览器插件完整指南
  • WSO2文件上传漏洞(CVE-2022-29464)深度剖析:不止于路径穿越的漏洞原理与修复方案
  • 宁德市2026年最新黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 大熊猫898989
  • AI商业化十字路口:从流量到任务,从注意力到执行经济的转变
  • CTFShow Web题避坑指南:那些年我踩过的SQL注入、文件包含和代码审计的坑
  • 告别L298N发热!用STM32CubeMX HAL库驱动TB6612控制直流电机(附完整代码)
  • AI重塑商业沟通协作:从工具到智能伙伴的底层逻辑与实践
  • 2026年株洲市黄金回收靠谱门店推荐 黄金+K金+白银+铂金回收门店TOP5排行榜+联系方式 - 盛世金银回收
  • 百度网盘提取码3秒智能解析:高效获取海量资源的实战秘籍
  • win10 win11快速安装python 等软件
  • 从RC电路到传递函数:用Python+SymPy手把手教你搞定拉氏反变换(附代码)
  • 音乐格式转换终极指南:3分钟学会NCM文件解密,让加密音乐自由播放