accept="image/*"在iOS和Android上唤起不同选择器:iOS强制弹出「照片」App,Android则行为分裂,常忽略该属性而打开默认文件管理器或显示“所有文件”。

accept="image/*"在iOS和Android上唤起的不是同一个选择器
它不只影响“显示哪些文件”,更直接决定系统调用哪个原生界面:iOS Safari 下 accept="image/*" 强制弹出「照片」App,用户看不到微信文件、iCloud Drive 或下载目录;而写成 accept=".jpg,.png" 反而会跳转到「文件」App,支持多来源选择。Android 行为更分裂:华为 EMUI、小米 MIUI 的 WebView 常忽略该属性,直接打开默认文件管理器;部分低端安卓 WebView 甚至完全不响应,一律显示“所有文件”。
macOS 上 Chrome 会查系统 UTI 注册表,不是只看扩展名
比如你设了 accept=".pem",但 macOS 系统里 .pem 和 .crt、.cer 都注册在同一个 UTI(public.x509-certificate)下,Chrome 就可能把这三类全放行——这不是 bug,是它主动查了系统注册表。Windows 和 Linux 没这层逻辑,基本按扩展名字符串匹配;所以同一段 HTML,在 macOS Chrome 里能选到 .crt,换到 Windows Chrome 就真只出 .pem。
Windows 和 Android 对 MIME 类型普遍不敏感
Windows 浏览器(Edge/Chrome)对 accept="application/pdf" 基本无反应,用户照样能点开 .exe;Android 多数机型也只认扩展名,MIME 类型常被跳过。但 iOS Safari 相反:单写 .pdf 可能被忽略,必须搭配标准 MIME,如 accept="application/pdf,.pdf" 才稳。这意味着:文档类上传别写通配符,统一用扩展名列表 accept=".pdf,.xlsx,.docx",比混写 MIME+扩展名在双端更可靠。
空格会让 Safari 直接丢掉整个 accept 属性
这是最容易被忽略的兼容性雷区:accept="image/png , .jpg" 里逗号后那个空格,会导致旧版 Safari(尤其是 iOS 15 之前)解析失败,整个属性作废,等效于没写。正确写法必须是 accept="image/png,.jpg"——无空格、无换行、无多余字符。移动端真机测试时,这个细节比 MIME 类型选得准不准还关键。
立即学习“前端免费学习笔记(深入)”;
真正跨平台稳定的写法,从来不是“选对一个值”,而是放弃幻想、分层处理:accept 控制入口可见性,JS 校验扩展名 + magic bytes 拦第一道,后端读文件头定生死。任何指望靠一行 accept 属性就搞定所有系统的做法,上线当天就会在某个用户手机上崩掉。



















