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

相关文章:

  • 别再为多重共线性头疼了!用sklearn的RidgeCV和Lasso搞定你的回归模型(附Longley数据集实战)
  • 微软董事霍夫曼将不参与连任竞选,欲专注人工智能药物研发初创公司
  • 2026年FY不锈钢液下泵权威品牌TOP5盘点:耐腐泵/耐腐耐磨液下泵/耐腐耐磨砂浆泵/耐腐耐腐循环泵/耐腐蚀离心泵/选择指南 - 优质品牌商家
  • 基于 Harmony 6.0 应用的健身训练计划生成器实现
  • C语言如何直接控制硬件指针、内存与寄存器
  • 思源宋体终极指南:7种字体样式完全免费商用方案
  • JVM 内存碎片治理:Java 堆外内存泄露诊断与 G1 混合垃圾回收区域(Mixed GC)碎片整理优化实战
  • 2026年主流陶瓷切削液供应商实力盘点:切削油、半合成切削液、氧化锆切削液、淬火油、淬火液、清洗剂、玻璃镜头切削液选择指南 - 优质品牌商家
  • 进一步优化LLM-Wiki大模型知识库,构建场景驱动的认知闭环
  • Git工作流实战:从‘ahead by N commits’提示,深入理解分支追踪与推送策略
  • 创新驱动 合规为基 一米臻选商业模式行业楷模
  • 30天突破:KaTrain围棋AI训练平台完全指南
  • 2026年瑞安旧房水电重做平台深度解析:专业服务商的选择与评估 - 2026年企业资讯
  • 从收音机到5G滤波器:品质因数Q如何影响你的手机信号和网速?
  • 电动扫地机厂家突围策略:6大核心步骤+实操案例,破解竞争困局
  • 避坑指南:为什么NetBackup客户端一重启就报错25?深入分析vxpbx_exchanged服务
  • Mac/Linux下conda创建虚拟环境报InvalidArchiveError?一个权限问题引发的‘血案’与终极修复
  • 企业号迁移/注销前必查!CSDN AI数字营销套餐绑定残留风险(3类隐性关联+2种强制解绑路径)
  • 别再死磕公式了!用Python+NumPy实战TDOA定位(从Chan到Fang算法对比)
  • Anaconda安装及使用超详细教程
  • 从DCDC到LDO:手把手教你用LM1117给STM32搭建一个‘安静’的3.3V电源
  • 电子阅读器成阅读首选,作者们喜爱的几款设备推荐
  • 新手避坑指南:跳过claudecode复杂安装,在快马轻松体验AI写代码
  • Claude平台突发大规模宕机:Anthropic基础设施承压,AI服务稳定性再引争议
  • 我把 LangGraph、RAG、Memory 、MCP 都拼进了 AI 助手, 领导说,你 太牛了
  • 如何通过TPFanCtrl2实现ThinkPad双风扇的终极静音控制:5分钟快速指南
  • LangChain 与 LangGraph:从 Agent 应用到可控工作流的完整工程图谱
  • Proteina-Complexa:NVIDIA 如何把蛋白 Binder 设计推进到全原子生成时代?
  • Flutter GetX 状态管理实战
  • 如何用LeagueAkari成为英雄联盟的智能玩家?终极本地化工具指南