首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 上傳文件到 PHP 服務端:FileNotFoundException 實為服務端 404/500 響應誤導

     編輯:程式設計疑難解答

現象

Android 端 HttpURLConnection.getInputStream() 拋出 FileNotFoundException: https://.../upload.php,但瀏覽器訪問該 URL 正常。

核心真相

HttpURLConnection 對 HTTP 錯誤狀態碼 (4xx/5xx) 拋出 `FileNotFoundException`,而非返回錯誤流。 實際上服務端 PHP 處理失敗(權限、路徑、配置),返回 404/500,客戶端誤以為「找不到文件」。

排查步驟

  1. 捕獲錯誤流:InputStream es = httpURLConnection.getErrorStream(); 讀取服務端實際返回體(含 PHP 錯誤信息)。
  2. 檢查響應碼:int code = httpURLConnection.getResponseCode(); 確認 200/404/500。
  3. PHP 端常見問題:
    • 目錄不可寫:chmod 777 uploads/ 或 PHP-FPM 運行用戶權限。
    • move_uploaded_file 目標路徑錯誤:`$_FILES['uploadedfile']['tmp_name']` 才是臨時文件,`$_FILES['uploadedfile']['name']` 僅是原始文件名。
    • `php.ini` 上傳限制:`upload_max_filesize`、`post_max_size`、`max_file_uploads`。
    • 臨時目錄權限:`sys_get_temp_dir()` 返回目錄需可寫。

Android 端健壯代碼模板

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);

現代化建議:棄用 HttpURLConnection,改用 OkHttp

// 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 權限/配置。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved