如何将带文件的完整访问路径添加到视图并实现点击下载?
问题根源
- 路径拼接错误:
src/main/resources/temp/是项目源码本地目录,应用启动后不会作为公开访问路径对外暴露,直接拼接到访问URI中用户请求必然返回404 - 视图层标签使用错误:
th:href是<a>链接标签的专属属性,你使用了<span>标签本身不支持跳转逻辑,且标签内部没有任何文本内容,所以页面不会显示任何可点击内容
修复方案
后端部分(二选一即可)
方案1:静态资源映射(适合非敏感公开文件)
将存储文件的temp目录移动到src/main/resources/static/路径下,该目录是Spring Boot默认开放的静态资源访问目录,修改生成下载URI的代码为:
String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath() .path("/temp/") .path(fileName) .toUriString(); model.addAttribute("fileDownloadUri", fileDownloadUri);
方案2:自定义下载接口(更安全,推荐)
新增专门的文件下载接口,避免内部目录暴露,也可以方便做权限校验:
@GetMapping("/download/{fileName}") public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) throws MalformedURLException { // 读取temp目录下的目标文件 Path filePath = Paths.get("src/main/resources/temp/").resolve(fileName).normalize(); Resource resource = new UrlResource(filePath.toUri()); // 设置下载响应头 return ResponseEntity.ok() .contentType(MediaType.APPLICATION_OCTET_STREAM) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") .body(resource); }
对应修改生成URI的代码:
String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath() .path("/download/") .path(fileName) .toUriString(); model.addAttribute("fileDownloadUri", fileDownloadUri); model.addAttribute("fileName", fileName);
前端部分
把原来的<span>标签替换为<a>链接标签,补充显示文本即可:
<a th:href="${fileDownloadUri}" th:text="${fileName}" download>点击下载文件</a>
download属性可以强制触发浏览器下载行为,不会直接在浏览器打开文件
内容的提问来源于stack exchange,提问作者JavaGrot
相关产品推荐
相关产品推荐

