Spring Boot中java.nio.file.AccessDeniedException异常求助
Spring Boot从Resource目录下载文件遇AccessDeniedException解决办法
问题描述
尝试从Spring Boot的resource目录下载文件时,抛出异常:
java.nio.file.AccessDeniedException: src\main\resources\generatedFiles
原下载代码:
FileSystemResource fileResource = new FileSystemResource("src/main/resources/generatedFiles/"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDisposition(ContentDisposition.attachment().filename("convertedCollection.feature").build()); headers.setContentLength(((FileSystemResource)fileResource).contentLength()); return ResponseEntity.ok().headers(headers).body(fileResource);
问题原因
- 访问对象错误:代码指向的是
generatedFiles目录而非具体的convertedCollection.feature文件,目录无法直接作为文件流返回,触发权限限制。 - 资源加载方式不兼容打包场景:
FileSystemResource仅能访问本地文件系统路径,Spring Boot打包成jar/war后,src/main/resources目录会被合并到jar内部,原路径不再存在;即使在开发环境,也可能因目录权限配置问题报错。
解决办法
通用解决方案(适配开发+生产环境)
使用Spring原生的ResourceLoader加载classpath资源,自动适配开发环境的文件系统和生产环境的jar包内资源:
- 注入
ResourceLoader:
@Autowired private ResourceLoader resourceLoader;
- 修改下载逻辑:
public ResponseEntity<Resource> downloadFeatureFile() throws IOException { // 直接指向classpath下的目标文件,无需添加src/main/resources前缀 Resource fileResource = resourceLoader.getResource("classpath:generatedFiles/convertedCollection.feature"); // 前置检查文件是否存在 if (!fileResource.exists()) { return ResponseEntity.notFound().build(); } HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); // 处理文件名编码,避免中文乱码 headers.setContentDisposition(ContentDisposition.attachment() .filename(fileResource.getFilename(), StandardCharsets.UTF_8) .build()); headers.setContentLength(fileResource.contentLength()); return ResponseEntity.ok().headers(headers).body(fileResource); }
开发环境临时调试方案
如果仅在开发环境测试,可快速修正:
- 将路径改为具体文件:
src/main/resources/generatedFiles/convertedCollection.feature - 确保
generatedFiles目录和目标文件有读写权限(Windows调整文件夹安全权限,Linux执行chmod 755 src/main/resources/generatedFiles)
内容的提问来源于stack exchange,提问作者Aniket Thorat
相关产品推荐
相关产品推荐

