Spring Boot目录文件列表接口失败:开头\路径参数问题求助
解决Spring Boot文件列表接口因参数开头反斜杠导致的失败问题
你创建了Spring Boot应用实现目录文件列表功能,相关代码如下:
Service层方法
public Set<String> listOfFilesOnPrem(String dir) { return Stream.of(new File(dir).listFiles()) .filter(file -> !file.isDirectory()) .map(File::getName) .collect(Collectors.toSet()); }
Controller层接口
@GetMapping("/onprem/list/files") public ResponseEntity<Set<String>> getListOfFilesOnPrem(@RequestParam String dir) { return new ResponseEntity<>(service.listOfFilesOnPrem(dir), HttpStatus.OK); }
问题:当请求参数dir以\开头(格式如\long.....\...\.....\....)时,功能执行失败,已通过调试确认问题出在开头的\上。
解决方案
参数预处理:去除开头的反斜杠
在Controller层接收参数后,直接对dir做清洗处理,去掉开头的单个或多个连续反斜杠。修改后的Controller代码:@GetMapping("/onprem/list/files") public ResponseEntity<Set<String>> getListOfFilesOnPrem(@RequestParam String dir) { // 替换开头所有连续的反斜杠为空 String processedDir = dir.replaceAll("^\\\\+", ""); return new ResponseEntity<>(service.listOfFilesOnPrem(processedDir), HttpStatus.OK); }注:Java中反斜杠需双重转义,正则
^\\\\+用于匹配字符串开头的一个或多个反斜杠。参数校验:提前拦截非法格式
可以通过注解添加参数校验,直接拒绝开头带反斜杠的请求,避免无效的业务处理:@GetMapping("/onprem/list/files") public ResponseEntity<Set<String>> getListOfFilesOnPrem( @RequestParam @Pattern(regexp = "^[^\\\\].*$", message = "路径不能以反斜杠开头") String dir) { return new ResponseEntity<>(service.listOfFilesOnPrem(dir), HttpStatus.OK); }使用Path类替代File类(更推荐)
Java的Path类对路径的兼容性更强,支持自动标准化路径,能处理冗余分隔符问题,同时Files.list()比File.listFiles()更安全(支持自动关闭流)。修改后的Service层代码:public Set<String> listOfFilesOnPrem(String dir) { Path path = Paths.get(dir).normalize(); // 标准化路径,自动处理冗余分隔符 try (Stream<Path> stream = Files.list(path)) { return stream.filter(Files::isRegularFile) .map(p -> p.getFileName().toString()) .collect(Collectors.toSet()); } catch (IOException e) { e.printStackTrace(); return Collections.emptySet(); } }
内容的提问来源于stack exchange,提问作者Haruri
相关产品推荐
相关产品推荐

