如何通过@GetMapping接口传递CSV相对路径读取指定目录文件?
需求实现方案
完全可以实现该需求,只需对现有代码做关键调整并做好安全防护,具体操作如下:
1. 调整路径变量的匹配规则
Spring默认的@PathVariable不会匹配URL中的斜杠(/),因此需要修改接口路径定义,让csvName能接收包含斜杠的相对路径:
@RestController @RequestMapping("/csv") public class CsvController { //...依赖注入及日志声明 // 修改路径为/{csvName:.+},允许变量匹配包含斜杠的字符串 @GetMapping("/get/player/{csvName:.+}") public void loadPlayers(@PathVariable String csvName) { CSVReader reader; try { // 直接使用传入的相对路径,对应项目根目录下的文件 reader = new CSVReaderBuilder(new FileReader(csvName)) .withSkipLines(1).build(); //...CSV解析及数据入库逻辑 } catch (FileNotFoundException | CsvValidationException | IOException e) { e.printStackTrace(); } } }
2. 增加路径安全校验(必做)
直接使用用户传入的路径存在路径遍历攻击风险(比如用户传入../src/main/resources/application.properties读取敏感文件),必须限制仅能访问csvs子目录:
@RestController @RequestMapping("/csv") public class CsvController { //...依赖注入及日志声明 private static final String ALLOWED_DIR = "csvs/"; @GetMapping("/get/player/{csvName:.+}") public void loadPlayers(@PathVariable String csvName) { // 校验路径是否以允许的目录开头,拦截非法访问 if (!csvName.startsWith(ALLOWED_DIR)) { throw new IllegalArgumentException("仅允许访问csvs目录下的文件"); } CSVReader reader; try { reader = new CSVReaderBuilder(new FileReader(csvName)) .withSkipLines(1).build(); //...CSV解析及数据入库逻辑 } catch (FileNotFoundException | CsvValidationException | IOException e) { e.printStackTrace(); } } }
3. 验证效果
将CSV文件放入项目根目录的csvs子目录后,使用期望URL请求:https://localhost:8080/csv/get/player/csvs/mycsvfile.csv
即可正常读取目标CSV文件。
内容的提问来源于stack exchange,提问作者David Ruiz
相关产品推荐
相关产品推荐

