iPad Safari中input file无法可靠读取File.size,需用setTimeout延迟校验并服务端强制限制;推荐capture="user"引导小文件来源。
在 iPad 上无法直接限制文件大小浏览器原生不支持通过 HTML 属性(如

accept 或自定义属性)在 iPad Safari 中拦截超大文件上传。所谓“前端限制”实际只是表单提交前的 JS 校验,用户仍可绕过 —— 更关键的是,iPad Safari 对 File.size 的读取存在延迟或不可靠行为,尤其在从“文件”App 导入时,files[0].size 可能返回 0 或 undefined,直到文件真正被加载进内存。
input.files + File.size 做基础校验,但必须加防抖和 fallback 提示iPad 上触发 change 事件后,不能立刻读取 size;需监听 load 或用 setTimeout 等待微任务就绪。否则容易误判为“空文件”或跳过检查。
document.getElementById('fileInput').addEventListener('change', function (e) {
const file = e.target.files[0];
if (!file) return;
// 防止 iPad Safari 读取 size 失败
setTimeout(() => {
if (!file.size || file.size === 0) {
alert('文件未正确读取,请重试');
e.target.value = ''; // 清空 input,避免重复提交
return;
}
const maxSize = 10 * 1024 * 1024; // 10MB
if (file.size > maxSize) {
alert(`文件不能超过 ${maxSize / 1024 / 1024}MB`);
e.target.value = '';
}}, 100);
});
服务端必须做二次校验,且响应要明确返回 413 或带错误字段的 JSON
iPad 用户可禁用 JS、改写表单、或用开发者工具绕过所有前端逻辑。服务端若只依赖前端传来的文件名或预估大小,极易被超大文件打挂进程或填满磁盘。
multer 时,必须设置 limits.fileSize,而非仅靠 fileFilter
$_SERVER['CONTENT_LENGTH'] 并配合 upload_max_filesize 和 post_max_size ini 设置{"error": "file_too_large", "max_size": 10485760}),便于 JS 统一提示capture="user" + accept 引导小文件来源iPad Safari 对 capture 属性支持较好,强制调起相机或相册时,生成的图片/视频天然可控(比如拍照一般不会超 5MB)。这比放任用户从“文件”App 拖拽一个 500MB 视频更现实。
注意:capture 不影响文件大小 API,但它把用户引导到更可控的输入路径 —— 这才是 iPad 上最有效的“软性约束”。
真正的硬限制只在服务端生效,而 iPad 的文件系统桥接机制决定了前端永远无法 100% 拦截大小。别在 onchange 里反复轮询 size,也别信“iOS 17 已修复”的传言 —— 它没修,也不会修。