Retrofit 2在Postman和本地正常,AWS线上服务器大文件上传异常
解决Retrofit大文件AWS上传失败问题
看起来你遇到的是典型的环境配置差异导致的大文件上传拦截问题——本地和Postman能正常工作,但AWS服务器上Android端大文件上传失败,核心原因大概率是AWS环境下的Web服务器或PHP配置限制了请求大小,或者Retrofit超时设置不够。下面是一步步的排查和解决方案:
1. 先排查Web服务器的请求大小限制(最可能的原因)
AWS上的Web服务器(Nginx/Apache)默认会限制单个请求的最大大小,如果你的文件超过这个值,请求会被直接拦截,根本到不了PHP层面,所以$_FILES会为空,导致你看到的错误。
如果你用Nginx:
- 找到站点配置文件(比如
/etc/nginx/sites-available/your-domain.conf)或者主配置nginx.conf - 添加或修改
client_max_body_size参数,设置为比你最大上传文件大的值(比如30M):server { ... client_max_body_size 30M; ... } - 重启Nginx生效:
sudo systemctl restart nginx
如果你用Apache:
- 打开Apache的主配置文件或者站点根目录的
.htaccess文件 - 添加
LimitRequestBody配置,单位是字节(30M=31457280字节):LimitRequestBody 31457280 - 重启Apache:
sudo systemctl restart apache2
2. 确认PHP的完整配置参数
你已经设置了upload_max_filesize=25M,但还有几个关键参数需要同步调整:
# php.ini 中的配置 upload_max_filesize = 25M post_max_size = 30M # 必须比upload_max_filesize大,因为POST请求包含文件+其他参数 max_input_time = 300 # 延长处理POST请求的时间(5分钟) memory_limit = 128M # 避免大文件上传时内存不足
修改后记得重启PHP-FPM(如果用的话)和Web服务器:sudo systemctl restart php-fpm
3. 调整Retrofit的超时设置
大文件上传需要更长的传输时间,Retrofit默认的超时时间(通常是几十秒)可能不够,导致请求中途断开,后端没接收到完整文件。在创建Retrofit实例时设置更长的超时:
OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.MINUTES) .readTimeout(5, TimeUnit.MINUTES) .writeTimeout(5, TimeUnit.MINUTES) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(Api.BASE_URL) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build();
4. 后端调试与权限检查
- 在
Api.php中添加详细日志,查看$_FILES的完整状态,确认错误类型:
这样你能看到具体的上传错误码(比如// 在Api.php开头添加 error_log("Received FILES: " . print_r($_FILES, true)); error_log("Received POST: " . print_r($_POST, true));UPLOAD_ERR_INI_SIZE表示超过PHP限制,UPLOAD_ERR_PARTIAL表示文件只传了一部分)。 - 检查上传目录的权限,确保PHP进程(通常是
www-data用户)有写入权限:sudo chown www-data:www-data /path/to/your/upload/folder sudo chmod 755 /path/to/your/upload/folder
按这个顺序排查,应该能解决你的大文件上传问题——毕竟小文件能正常工作,说明代码逻辑本身是没问题的,就是环境配置的限制。
内容的提问来源于stack exchange,提问作者DragonFire
相关产品推荐
相关产品推荐

