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

如何在React/TypeScript中用Yup验证上传文件名不重复?

文件上传重复文件名验证实现思路(React/TypeScript)

以下是几种实现文件集中无重复文件名验证的实用思路,可结合你已有的文件名规则验证逻辑整合:

1. 利用Set数据结构快速检测重复

Set的核心特性是存储唯一值,通过遍历文件列表收集文件名,对比Set的长度与原文件数量即可判断是否存在重复。如果需要忽略大小写(比如将Test.txt和test.txt视为重复),可以先将文件名统一转成小写/大写再存入Set。

示例代码(整合原有验证逻辑)

先修正你原有代码中的逻辑问题(原代码会在第一个符合规则的文件就返回true,忽略后续不符合的文件),再添加重复验证:

const SUPPORTED_NAMES = ["text", "command", "execute"];

// 验证单个文件符合命名规则
const isValidFileName = (file: File): boolean => {
  return SUPPORTED_NAMES.some(name => 
    file.name.toLowerCase().includes(name.toLowerCase())
  );
};

// 检查是否存在重复文件名(caseSensitive控制是否区分大小写)
const hasDuplicateFiles = (files: FileList, caseSensitive = false): boolean => {
  const nameSet = new Set<string>();
  for (let i = 0; i < files.length; i++) {
    const file = files.item(i);
    if (!file?.name) continue;
    const targetName = caseSensitive ? file.name : file.name.toLowerCase();
    if (nameSet.has(targetName)) {
      return true; // 发现重复
    }
    nameSet.add(targetName);
  }
  return false;
};

// 整合验证的测试函数
test('fileValidation', 'invalid files', (value: FileList) => {
  // 先验证所有文件符合命名规则
  for (let i = 0; i < value.length; i++) {
    const file = value.item(i);
    if (!file?.name || !isValidFileName(file)) {
      return false;
    }
  }
  // 再验证无重复文件名
  return !hasDuplicateFiles(value);
});

2. 数组遍历对比(兼容旧环境)

如果需要兼容不支持Set的环境,可以用数组存储已遍历的文件名,每次遍历新文件时检查数组中是否已存在对应名称:

const hasDuplicateFiles = (files: FileList, caseSensitive = false): boolean => {
  const nameList: string[] = [];
  for (let i = 0; i < files.length; i++) {
    const file = files.item(i);
    if (!file?.name) continue;
    const targetName = caseSensitive ? file.name : file.name.toLowerCase();
    if (nameList.includes(targetName)) {
      return true;
    }
    nameList.push(targetName);
  }
  return false;
};

关键注意点

  • 若业务要求严格区分文件名大小写,将caseSensitive设为true即可;否则统一转大小写避免误判。
  • 原有验证逻辑需调整:确保所有文件都符合命名规则才返回true,而非第一个符合就返回。

内容的提问来源于stack exchange,提问作者Jose Reyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:55:16