批量导出字段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(); }三:效果
