Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[upload] 文件上传的 accept 设置为特殊类型时,不会正常接受对应类型的文件 #2998

Open
sagittarius-rev opened this issue Dec 25, 2023 · 2 comments
Assignees

Comments

@sagittarius-rev
Copy link

sagittarius-rev commented Dec 25, 2023

tdesign-vue 版本

tdesign-vue 1.8.3

重现链接

https://codesandbox.io/p/sandbox/tdesign-vue-demo-forked-w74mxt?file=%2Fsrc%2Fdemo.vue%3A16%2C17

重现步骤

在页面上放置 TUpload 组件,设置允许拖拽。
设置 accept 属性,预期只接受指定类型的文件。示例代码中 accept=".p12" ,预期只接收扩展名为 p12 的文件。
从资源管理器拖动 p12 类型的文件到上传组件内。

期望结果

拖动文件的类型与预设 accept 类型一致,应当被接受。

实际结果

拖动文件没有被接受,文件列表中不会出现刚拖动过来的项目。

框架版本

Vue(2.6.14)

浏览器版本

Chrome(112.0.5615.138)

系统版本

Windows 10

Node版本

16.16.0

补充说明

检查源代码后发现,问题出在公用库 tdesign-common 的 代码 /js/upload/utils.ts 中。以下是有问题的代码:

export function validateFileType(accept: string, fileType: string, fileName?: string) {
  const tmpFileType = fileType || fileName;
  if (!accept) return true;

  if (!tmpFileType) return false;

  const acceptList = accept.split(',').map((v) => v.trim());
  for (let i = 0, len = acceptList.length; i < len; i++) {
    const oneRule = acceptList[i];
    if (INPUT_FILE_MAP[oneRule] && INPUT_FILE_MAP[oneRule].test(tmpFileType)) {
      return true;
    }
    const regExp = new RegExp(oneRule, 'i');
    if (regExp.test(tmpFileType)) {
      return true;
    }
  }
  return false;
}

此代码存在两个严重问题:

  1. 在循环之前,先用 fileTypefileName 两个参数做了一个或运算,得到结果 tmpFileType 在循环内使用。循环中如果 mime 类型匹配不成功,就会用 accrept 拆分出来的字符串创建一个正则表达式对象,然后对 tmpFileType 变量进行检测。
    问题是,示例代码运行到此处时,创建的正则表达式是基于 ".p12" 的,而 tmpFileType 实际上取的是文件 mime 类型(application/x-pkcs12),而不是文件名。因此这里的正则表达式会检测失败。
    正确的做法应该是在循环内分别检测文件类型和文件名( regExp.test(fileType ) || regExp.test(fileName) ),而不是在循环之前先做或运算,导致文件名在判断过程中被忽略。

  2. new RegExp() 调用时,没有对 oneRule 进行安全转换。如果 oneRule 中包含特殊字符,例如 * ,就会导致程序报错。

Copy link
Contributor

👋 @sagittarius-rev,感谢给 TDesign 提出了 issue。
请根据 issue 模版确保背景信息的完善,我们将调查并尽快回复你。

Copy link
Contributor

github-actions bot commented Dec 25, 2023

♥️ 有劳 @chaishi @ctudoudou @uyarn @brianzhang @byq1213 @chaishi 尽快确认问题。
确认有效后将下一步计划和可能需要的时间回复给 @sagittarius-rev

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants