手机拍完照片,想发到社交平台、购物网站或者公司系统里,点上传却卡住不动。很多人第一反应是网络不好,但其实背后的原因复杂得多。别急着重启APP,先看看是不是下面这些情况在作怪。
网络连接不稳定或被限制
最常见的情况就是Wi-Fi信号弱,或者切换网络时没及时刷新。比如你在地铁站连了个公共Wi-Fi,看着有信号,但实际上上传通道被限速或屏蔽了。这时候图片传到一半就断掉,提示“请求失败”。
还有些公司或学校网络会屏蔽文件上传接口,尤其是POST请求。你试过在办公室上传头像一直转圈,回家一试就好了?大概率是网络策略的问题。
图片格式或大小超出限制
很多应用只支持JPG、PNG,你要是传个HEIC(iPhone默认格式)或者WebP,后台解析不了,直接拒绝。更常见的是文件太大——比如你拍了一张高清原图,8MB起步,而系统规定不能超过2MB。
这时候前端通常该提示,但有些老版本APP根本不校验,直接发请求,结果服务器返回413 Payload Too Large,用户只看到“上传失败”,根本不知道为啥。
请求头(Headers)缺失关键信息
上传图片不是简单把文件扔过去,得打包成 multipart/form-data 格式,还要带上身份凭证。比如登录后的 token 没加到请求头里,服务器当成匿名用户直接拒了。
Content-Type: multipart\/form-data; boundary=----WebKitFormBoundaryd1YfI0N6ghy5x0Zv
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
少一个 Authorization,哪怕图片本身没问题,照样失败。
跨域问题(CORS)拦住了请求
你在本地调试网页,用localhost访问图片接口,浏览器一看域名不一致,直接拦截。控制台报错:‘No 'Access-Control-Allow-Origin' header’。这不是代码写错了,而是服务端没配置允许你的域名发起请求。
这种情况在开发阶段特别多,普通用户一般碰不到,但如果用的是第三方工具或插件上传,也可能触发。
服务器接口异常或路径错误
URL写错了,比如把 /upload 写成 /uplaod,请求根本到不了后端。或者服务器正在维护,返回500错误。有时候APP版本太久,接口已经下线,但客户端没更新,还在往旧地址发数据。
有个小技巧:用浏览器开发者工具看Network面板,找到那个failed的请求,点进去看状态码。400一般是客户端参数问题,500就是服务器那边炸了。
手机存储权限没开
安卓和iOS现在都管得严,第一次选图时要你授权访问相册。如果当时点了“拒绝”,之后上传功能就拿不到文件路径,请求里body为空,自然失败。很多人忘了这茬,反复重试都没用。
去设置里打开APP权限,再回来试试,往往就好了。
时间不同步导致签名失效
有些系统上传前要生成签名,依赖客户端时间。如果你手机时间不准,差了几分钟,签名验证失败,服务器直接拒绝。这种情况在刷机或双卡手机上偶尔出现。
进设置里打开“自动同步时间”,问题常能解决。
并发上传太多,触发限流
批量上传几十张图时,有些APP一股脑发请求,服务器扛不住,开始限流。返回429 Too Many Requests,前端没做友好提示,统一显示“上传失败”。
放慢节奏,一张张传,或者换个时间段再试,常常能绕过去。