下载模板

前提:在resource目录下创建template文件夹,存放模板文件:

以下方法无入参:

try {
// 模板文件路径 - 使用classpath方式访问资源文件
String templatePath = "template/xxx模板.docx";

// 使用ClassPathResource访问resources目录下的文件
Resource resource = new ClassPathResource(templatePath);

if (!resource.exists()) {
log.error("模板文件不存在: {}", templatePath);
return new ResponseEntity<>("模板文件不存在", HttpStatus.NOT_FOUND);
}

// 读取文件内容 - 兼容JAR包部署
byte[] fileContent;
try {
// 优先尝试通过InputStream读取(兼容JAR包)
fileContent = StreamUtils.copyToByteArray(resource.getInputStream());
} catch (Exception e) {
log.warn("通过InputStream读取失败,尝试通过File读取: {}", e.getMessage());
// 降级到File方式读取
fileContent = Files.readAllBytes(resource.getFile().toPath());
}

// 设置响应头
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");// 模板是word格式
// 若是excel,以xlsx结尾的,可以设置 ”application/vnd.openxmlformats-officedocument.spreadsheetml.sheet“
    // 处理中文文件名编码,确保在不同浏览器中都能正确显示
String fileName = "xxx模板.docx";
String encodedFileName;
try {
// 尝试UTF-8编码
encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + encodedFileName);
} catch (Exception e) {
// 如果编码失败,使用原始文件名
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
}

response.setContentLength(fileContent.length);

// 写入响应流
response.getOutputStream().write(fileContent);
response.getOutputStream().flush();

log.info("模板下载成功: {}", templatePath);
return new ResponseEntity<>(HttpStatus.OK);

} catch (Exception e) {
log.error("下载模板失败", e);
return new ResponseEntity<>("下载模板失败: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}

posted on 2025-10-11 09:38  黑子菜园  阅读(3)  评论(0)    收藏  举报

导航