You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:01:05