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

导入模板下载

一、接口定义

@ApiOperationSupport(order=6)@ApiOperation("下载导入模板")@CommonLog("下载导入模板")@GetMapping(value="/base/dxssyjjbxx/downloadImportTemplate",produces=MediaType.APPLICATION_OCTET_STREAM_VALUE)publicvoiddownloadImportTemplate(HttpServletResponseresponse)throwsIOException{jcDxssyjjbxxService.downloadImportTemplate(response);}
  • 请求方式:GET
  • 参数:
  • 返回:application/octet-stream文件流(模板 Excel)

二、服务层实现

@OverridepublicvoiddownloadImportTemplate(HttpServletResponseresponse)throwsIOException{try{// 1. 从 classpath 加载模板文件InputStreaminputStream=POICacheManager.getFile("dxssyjjbxxExportTemplate.xlsx");// 2. 读取为字节数组byte[]bytes=IoUtil.readBytes(inputStream);// 3. 写入 response 输出流下载CommonDownloadUtil.download("导入模板.xlsx",bytes,response);}catch(Exceptione){log.error(">>> 下载导入模板失败:",e);CommonResponseUtil.renderError(response,"下载导入模板失败");}}

调用链:ControllerJcDxssyjjbxxServiceImpl.downloadImportTemplate()
POICacheManager.getFile()加载模板 →CommonDownloadUtil.download()输出到浏览器


三、核心方法详解

3.1 模板加载(POICacheManager)

// EasyPoi 的 POICacheManager 从 classpath 加载文件InputStreaminputStream=POICacheManager.getFile("dxssyjjbxxExportTemplate.xlsx");

逻辑:POICacheManager(EasyPoi 内置类)从 classpath 根目录加载文件,带缓存机制。同名文件只加载一次,后续读取从缓存返回。

模板文件位置:

模块路径
src/main/resources/dxssyjjbxxExportTemplate.xlsx

3.2 文件下载(CommonDownloadUtil)

/** * 通用文件下载工具类 * 文件路径:/.../util/CommonDownloadUtil.java */publicstaticvoiddownload(StringfileName,byte[]fileBytes,HttpServletResponseresponse){try{response.setHeader("Content-Disposition","attachment;filename="+URLUtil.encode(fileName));response.addHeader("Content-Length",""+fileBytes.length);response.setHeader("Access-Control-Allow-Origin","*");response.setHeader("Access-Control-Expose-Headers","Content-Disposition");response.setContentType("application/octet-stream;charset=UTF-8");IoUtil.write(response.getOutputStream(),true,fileBytes);}catch(IOExceptione){log.error(">>> 文件下载异常:",e);}}

逻辑:设置 HTTP 响应头(Content-Disposition附件下载、Content-Length、CORS),然后将字节数组写入 response 输出流。

3.3 异常处理(CommonResponseUtil)

CommonResponseUtil.renderError(response,"下载导入模板失败");

当模板加载或下载异常时,通过此方法向 response 写入错误信息,而非抛出异常中断请求。


四、使用场景

// 场景一:前端直接调用下载// GET /base/dxssyjjbxx/downloadImportTemplate// 浏览器弹出文件下载对话框,保存为 "导入模板.xlsx"// 场景二:配合导入功能// 用户先下载模板 → 按模板格式填写数据 → 调用 POST /base/dxssyjjbxx/import 上传

五、注意事项

  1. 模板文件路径dxssyjjbxxExportTemplate.xlsx必须放在 resources 目录下,POICacheManager从 classpath 根目录查找,找不到会抛异常。
  2. 文件名编码CommonDownloadUtil中使用URLUtil.encode(fileName)对中文文件名进行 URL 编码,避免浏览器下载时文件名乱码。
  3. CORS 头— 设置了Access-Control-Allow-Origin: *Access-Control-Expose-Headers: Content-Disposition,支持跨域下载。
http://www.zskr.cn/news/1476797.html

相关文章:

  • JVM 内存碎片治理:Java 堆外内存泄露诊断与 G1 混合垃圾回收区域(Mixed GC)碎片整理优化实战
  • 2026年主流陶瓷切削液供应商实力盘点:切削油、半合成切削液、氧化锆切削液、淬火油、淬火液、清洗剂、玻璃镜头切削液选择指南 - 优质品牌商家
  • 进一步优化LLM-Wiki大模型知识库,构建场景驱动的认知闭环
  • Git工作流实战:从‘ahead by N commits’提示,深入理解分支追踪与推送策略
  • 企业号迁移/注销前必查!CSDN AI数字营销套餐绑定残留风险(3类隐性关联+2种强制解绑路径)
  • 新手避坑指南:跳过claudecode复杂安装,在快马轻松体验AI写代码
  • Anaconda安装及使用超详细教程
  • Flutter GetX 状态管理实战
  • Proteina-Complexa:NVIDIA 如何把蛋白 Binder 设计推进到全原子生成时代?
  • 如何用LeagueAkari成为英雄联盟的智能玩家?终极本地化工具指南
  • 如何通过TPFanCtrl2实现ThinkPad双风扇的终极静音控制:5分钟快速指南
  • 避坑指南:SAP COPA获利分析增强COPA0001里,销售订单类型判断与PRODH字段填充的那些坑
  • ArcGIS 属性导出 Excel 三种实操,复制 / CSV / 表转 Excel 优缺点详解
  • uniapp map自定义标注避坑指南:customCallout在iOS和Android上显示效果不一致怎么办?
  • 3分钟上手Easy-Topo:免费SVG网络拓扑图工具终极指南
  • 高并发 LLM 推理服务化:基于 Triton Inference Server 的多模型管道(Ensemble BLS)高吞吐推理调度架构与动态批处理(Dynamic Batching)实战
  • 钢结构的除锈等级划分
  • 8类果树病害检测数据集(炭疽病/白粉病/根腐病等)| 6000张YOLO智慧农业病虫害监测数据集 适用于果园智能监测、病害识别与目标检测研究
  • Linux 多磁盘分区挂载实战 踩坑复盘
  • CSDN博主必看:如何优雅地在Markdown和评论区插入最新emoji表情(附懒人包)
  • NS25CL直线导轨技术规格与应用指南
  • 2026年小包团价格,甘肃嘉恒国旅费用透明 - myqiye
  • 大模型 API 成本优化:从月账单十万到三万的架构演进
  • GPU显存稳定性终极检测:用memtest_vulkan快速诊断显卡故障的完整指南
  • GPT-4V核心架构
  • 素颜霜哪款好用?2026全肤质素颜霜实测:清透自然打造原生肌 - 新闻快传
  • 过来人血泪经验|2026年6月上海嘉定区值得信赖的老银元回收+老银锭回收门店 - 沪上贵金属口碑推荐官
  • 解锁大屏视界:手机视频投屏全攻略
  • 苏州塑胶模具定制厂选购有哪些要点 - myqiye
  • Moneta外汇体验细节路径流畅吗?