iOS上对不常见的文件扩展名,input type="file" accept=...会失败

移动开发 2026-07-08

我想用HTML让用户上传织花图案文件。以下代码在macOS 15的 Safari与 Brave上工作得很完美,但在iOS或 iPadOS 26的 Safari/Brave上却严重失败:

<input type="file" accept=".dtx,.wif,.wpo">

我在iPhone和 iPad上观察到,没有任何指定的文件被允许上传,但一些文本文件,例如.py文件,却被允许。注意,.dtx和 .wif文件是文本文件,但.wpo是二进制。

指定常见的文件扩展名,例如 ".pdf" 的确有效(尽管在iOS和 iPadOS上仍然也接受.py文件)。

在iOS上移除 "accept" 会导致上传按钮提供一个菜单:Photo Library/Take Photo or Video/Choose File",这很糟糕。

到目前为止,我找到的最佳变通方法如下。它在iOS和 iPadOS上允许所有文件类型(并非理想,但比禁止我想要的扩展名要好得多)。在macOS上似乎也能完美工作(至少允许所需的类型并禁止pdf和 jpeg):

<input type="file" accept="application/octet-stream,.dtx,.wif,.wpo">

关于在iOS和 iPadOS上如何正确过滤所需扩展名,有什么建议吗?

(已根据Iłya Bursov的建议,去除了accept值中的错误空格。)

解决方案

你的变通方法很可能是正确的实际解决方案;iOS Safari无法可靠地仅通过 accept=".ext" 来过滤任意/不常见的扩展名。

我建议仅将 accept 作为用户体验提示,在选择后再自行进行验证。

示例:

<input id="fileInput" type="file" accept="application/octet-stream,.dtx,.wif,.wpo">
const allowed = [".dtx", ".wif", ".wpo"];

document
  .getElementById("fileInput")
  .addEventListener("change", e => {
    const file = e.target.files[0];

    if (!file) return;

    const ext = "." + file.name.split(".").pop().toLowerCase();

    if (!allowed.includes(ext)) {
      alert("Unsupported file type");
      e.target.value = "";
    }
  });

对于自定义文件格式:

<input type="file" accept="application/octet-stream,.dtx,.wif,.wpo">
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章