用户选了一张 12MB 的图,点上传后页面直接白了,控制台只有一行 413 Request Entity Too Large。刷新回来表单也空了,用户又选了同一张图。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

client_max_body_size 20m;

input.addEventListener('change', e => {
  if (e.target.files[0].size > 8 * 1024 * 1024) alert('图片不能超过 8MB');
});

请求在 Nginx 这一层就被拒了,PHP 没有执行,前端拿到的是服务商默认的 HTML 错误页。代码只按 JSON 解析响应,解析失败就落进未知错误分支,文件大小这句提示根本没机会出现。这一点先确认清楚,后面就不用反复试。

「上传超限提示」这类改动最怕改一半,回滚脚本先准备好,再动生产。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

具体做法是,在 server 段把 client_max_body_size 调到业务上限,确认 PHP 的 post_max_size 不小于它;前端在 change 里先读 file.size,超过阈值直接提示具体兆数,不发请求;给 413 单独写分支,把状态码翻译成文件太大,并保留已填字段。

改完照着核一遍,选一张 12MB 的图,页面停在原地并提示上限 8MB,网络面板里没有发出请求。

作者 9823189