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
相关产品推荐
相关产品推荐

