一、接口定义ApiOperationSupport(order6)ApiOperation(下载导入模板)CommonLog(下载导入模板)GetMapping(value/base/dxssyjjbxx/downloadImportTemplate,producesMediaType.APPLICATION_OCTET_STREAM_VALUE)publicvoiddownloadImportTemplate(HttpServletResponseresponse)throwsIOException{jcDxssyjjbxxService.downloadImportTemplate(response);}请求方式GET参数无返回application/octet-stream文件流模板 Excel二、服务层实现OverridepublicvoiddownloadImportTemplate(HttpServletResponseresponse)throwsIOException{try{// 1. 从 classpath 加载模板文件InputStreaminputStreamPOICacheManager.getFile(dxssyjjbxxExportTemplate.xlsx);// 2. 读取为字节数组byte[]bytesIoUtil.readBytes(inputStream);// 3. 写入 response 输出流下载CommonDownloadUtil.download(导入模板.xlsx,bytes,response);}catch(Exceptione){log.error( 下载导入模板失败,e);CommonResponseUtil.renderError(response,下载导入模板失败);}}调用链Controller→JcDxssyjjbxxServiceImpl.downloadImportTemplate()→POICacheManager.getFile()加载模板 →CommonDownloadUtil.download()输出到浏览器三、核心方法详解3.1 模板加载POICacheManager// EasyPoi 的 POICacheManager 从 classpath 加载文件InputStreaminputStreamPOICacheManager.getFile(dxssyjjbxxExportTemplate.xlsx);逻辑POICacheManagerEasyPoi 内置类从 classpath 根目录加载文件带缓存机制。同名文件只加载一次后续读取从缓存返回。模板文件位置模块路径src/main/resources/dxssyjjbxxExportTemplate.xlsx3.2 文件下载CommonDownloadUtil/** * 通用文件下载工具类 * 文件路径/.../util/CommonDownloadUtil.java */publicstaticvoiddownload(StringfileName,byte[]fileBytes,HttpServletResponseresponse){try{response.setHeader(Content-Disposition,attachment;filenameURLUtil.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;charsetUTF-8);IoUtil.write(response.getOutputStream(),true,fileBytes);}catch(IOExceptione){log.error( 文件下载异常,e);}}逻辑设置 HTTP 响应头Content-Disposition附件下载、Content-Length、CORS然后将字节数组写入 response 输出流。3.3 异常处理CommonResponseUtilCommonResponseUtil.renderError(response,下载导入模板失败);当模板加载或下载异常时通过此方法向 response 写入错误信息而非抛出异常中断请求。四、使用场景// 场景一前端直接调用下载// GET /base/dxssyjjbxx/downloadImportTemplate// 浏览器弹出文件下载对话框保存为 导入模板.xlsx// 场景二配合导入功能// 用户先下载模板 → 按模板格式填写数据 → 调用 POST /base/dxssyjjbxx/import 上传五、注意事项模板文件路径—dxssyjjbxxExportTemplate.xlsx必须放在 resources 目录下POICacheManager从 classpath 根目录查找找不到会抛异常。文件名编码—CommonDownloadUtil中使用URLUtil.encode(fileName)对中文文件名进行 URL 编码避免浏览器下载时文件名乱码。CORS 头— 设置了Access-Control-Allow-Origin: *和Access-Control-Expose-Headers: Content-Disposition支持跨域下载。