iOS上对不常见的文件扩展名,input type="file" accept=...会失败
我想用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。