Android 端 HttpURLConnection.getInputStream() 拋出 FileNotFoundException: https://.../upload.php,但瀏覽器訪問該 URL 正常。
HttpURLConnection 對 HTTP 錯誤狀態碼 (4xx/5xx) 拋出 `FileNotFoundException`,而非返回錯誤流。 實際上服務端 PHP 處理失敗(權限、路徑、配置),返回 404/500,客戶端誤以為「找不到文件」。
InputStream es = httpURLConnection.getErrorStream(); 讀取服務端實際返回體(含 PHP 錯誤信息)。int code = httpURLConnection.getResponseCode(); 確認 200/404/500。chmod 777 uploads/ 或 PHP-FPM 運行用戶權限。move_uploaded_file 目標路徑錯誤:`$_FILES['uploadedfile']['tmp_name']` 才是臨時文件,`$_FILES['uploadedfile']['name']` 僅是原始文件名。HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setChunkedStreamingMode(128 * 1024); // 防 OOM
// 構建 multipart/form-data 請求體(省略邊界拼接細節,建議用 OkHttp)
try (DataOutputStream dos = new DataOutputStream(conn.getOutputStream())) {
// ... 寫入邊界、文件內容 ...
}
int responseCode = conn.getResponseCode();
InputStream is = (responseCode >= 200 && responseCode < 300)
? conn.getInputStream()
: conn.getErrorStream(); // 關鍵:錯誤碼也要讀流
String response = readStream(is); // 統一讀取
Log.d("UPLOAD", "Code: " + responseCode + ", Resp: " + response);
// OkHttp 3.x+
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("uploadedfile", "image.jpg",
RequestBody.create(MediaType.parse("image/jpeg"), file))
.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Code: " + response.code());
Log.d("UPLOAD", response.body().string());
}
**結論:`FileNotFoundException` 是假象,實為服務端錯誤響應;必讀 `getErrorStream()` 並修復 PHP 權限/配置。**