You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:08:12