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

Linux独立服务器PHP8+Nginx环境下Android图片上传失败

Android POST上传图片到Nginx+PHP8时$_FILES为空的问题解决

问题核心

Nginx日志显示Android端发送的是GET请求而非预期的POST,这直接导致PHP无法通过$_FILES获取上传文件(GET请求不会携带multipart/form-data格式的文件数据)。网页表单测试正常,说明服务器端的PHP配置、Nginx上传逻辑无问题,问题出在Android端的请求实现或Nginx的重定向配置。

排查与解决步骤

1. 修正Android端的请求方法实现

确保代码中明确设置POST请求,并开启输出流(针对HttpURLConnection):

  • 错误示例(默认GET请求):
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 未显式设置POST请求方法
  • 正确示例:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true); // 必须开启才能发送POST数据
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

如果使用OkHttp,确保调用post()方法构建请求:

RequestBody requestBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("file", "image.jpg", RequestBody.create(MediaType.parse("image/jpeg"), file))
        .build();
Request request = new Request.Builder()
        .url(uploadUrl)
        .post(requestBody) // 必须指定POST方法
        .build();

2. 修复Nginx重定向导致的POST转GET问题

若服务器配置了HTTP转HTTPS的重定向(301/302),默认会将POST请求转为GET。需修改Nginx配置,使用307或308状态码保持请求方法:

server {
    listen 80;
    server_name your-domain.com;
    # 307为临时重定向,308为永久重定向,均会保留POST方法
    return 307 https://$server_name$request_uri;
}

3. 确认PHP8上传配置(可选)

因网页表单上传正常,此步骤大概率无需修改,但可排查php.ini参数确保数值足够:

upload_max_filesize = 10M
post_max_size = 10M
max_file_uploads = 20

修改后重启PHP-FPM与Nginx。

验证方法

修改后重新上传,查看Nginx的access.log确认请求方法为POST,同时在PHP代码中输出$_SERVER['REQUEST_METHOD'],检查是否返回POST。

内容的提问来源于stack exchange,提问作者AndroidPlayer2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:45:57