网站后台上传不了图片
上周三下午,网站同事小陈在群里发了一张截图,后台后台编辑器里那个“上传图片”的上传按钮点了十几次,进度条卡在0%不动。不图她以为是网站网络问题,换了手机热点,后台还是上传一样。整个下午,不图公司三个编辑都在传图这件事上耗着,网站最后只能把图片先发到微信文件传输助手,后台再一张张下载到本地,上传手动改尺寸,不图绕了一大圈才把稿子发出去。网站
这种事不是后台第一次了。网站后台上传图片失败,上传原因往往藏在几个很具体的地方,跟“服务器崩了”这种笼统猜测关系不大。
先看浏览器控制台,别急着重启
按F12打开开发者工具,切到Network面板,再点一次上传按钮。如果看到某个请求标红,状态码是413,那问题很明确——图片太大了,超过了服务器或中间件(比如Nginx)设置的client_max_body_size限制。很多虚拟主机默认只给1MB或2MB,手机拍的原图动辄四五MB,传上去必挂。
如果状态码是502或504,那多半是后端处理超时。图片上传后通常要经过压缩、裁剪、生成缩略图这几步,PHP的max_execution_time或者后端服务的超时设置太短,大图还没处理完就被掐断了。这种情况在小内存VPS上特别常见。
还有一种更隐蔽的:请求返回200,但响应体里是一段HTML而不是JSON。这通常意味着上传接口被某个中间件拦截了,比如WAF(Web应用防火墙)把图片文件当成了恶意载荷。我们之前用某云服务商的免费WAF,它会把包含特定EXIF信息的图片直接拦掉,前端拿不到错误提示,只看到上传失败。
权限和目录问题比想象中普遍
有次帮一个客户排查,发现上传目录的属主是root,而PHP-FPM以www-data运行。文件写不进去,但错误日志里只记了一句“move_uploaded_file failed”,没提权限。改完属主和755权限,问题消失。这种坑在迁移服务器后特别容易踩到,因为老服务器的目录权限可能早就被手动改过,新服务器按默认配置来,就不对了。
另外,如果用的是对象存储(OSS、S3之类),检查一下AccessKey的权限策略。有些子账号只有读权限,没有写权限,上传接口调用时返回403,但前端可能只显示“上传失败”,不告诉你具体原因。
前端限制也值得看一眼
有些编辑器会在前端做文件类型校验,比如只允许image/jpeg和image/png。如果你传的是WebP或者HEIC(iPhone默认格式),前端直接拦掉,请求根本发不出去。这种情况控制台里不会有网络请求,只在Console面板里有一行警告。小陈那次就是,她用iPhone拍的照是HEIC格式,编辑器不认,换JPG后立刻正常。
还有种情况是上传组件依赖的某个JS库加载失败,比如CDN被墙了。按钮看着能点,实际事件没绑上。打开Console看有没有404或跨域报错,基本能定位。
我的排查顺序
先换一张小尺寸的JPG试。如果小图能传,大图不行,查大小限制和超时。小图也不行,开控制台看Network和Console。Network里没请求,查前端JS和文件格式。有请求但报错,看状态码和响应内容。状态码正常但没成功,查后端日志和目录权限。对象存储的话,直接去存储桶里看文件到底有没有写进去。
这套流程走下来,大部分上传问题十分钟内能定位。最怕的是那种“偶尔失败”的,可能跟并发有关,比如临时目录被写满,或者多个请求同时生成缩略图把内存撑爆。那种就得看监控和日志慢慢磨了。
小陈后来把手机相机设置改成了“兼容性最佳”,默认输出JPG。她说不想再为传图这种事加班了。我理解她。
(责任编辑:探索)













