使用 HttpURLConnection 上傳(POST)檔案

通常,有必要將檔案傳送/上傳到遠端伺服器,例如,影象,視訊,音訊或應用程式資料庫的備份到遠端專用伺服器。假設伺服器期望帶有內容的 POST 請求,這裡有一個如何在 Android 中完成此任務的簡單示例。

使用 multipart/form-data POST 請求傳送檔案上傳。它很容易實現:

URL url = new URL(postTarget);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

String auth = "Bearer " + oauthToken;
connection.setRequestProperty("Authorization", basicAuth);

String boundary = UUID.randomUUID().toString();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

DataOutputStream request = new DataOutputStream(uc.getOutputStream());

request.writeBytes("--" + boundary + "\r\n");
request.writeBytes("Content-Disposition: form-data; name=\"description\"\r\n\r\n");
request.writeBytes(fileDescription + "\r\n");

request.writeBytes("--" + boundary + "\r\n");
request.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.fileName + "\"\r\n\r\n");
request.write(FileUtils.readFileToByteArray(file));
request.writeBytes("\r\n");

request.writeBytes("--" + boundary + "--\r\n");
request.flush();
int respCode = connection.getResponseCode();

switch(respCode) {
    case 200:
        //all went ok - read response
        ...
        break;
    case 301:
    case 302:
    case 307:
        //handle redirect - for example, re-post to the new location
        ...
        break;
    ...
    default:
        //do something sensible
}

當然,需要捕獲或宣告異常被丟擲。有幾點需要注意這段程式碼:

  1. postTarget 是 POST 的目標 URL; oauthToken 是身份驗證令牌; fileDescription 是檔案的描述,它作為欄位 description 的值傳送; file 是要傳送的檔案 - 它的型別為 java.io.File - 如果你有檔案路徑,你可以使用 new File(filePath) 代替。
  2. 它為 oAuth auth 設定了 Authorization 標頭
  3. 它使用 Apache Common FileUtil 將檔案讀入位元組陣列 - 如果你已經將檔案內容以位元組陣列或其他方式儲存在記憶體中,則無需讀取它。