使用 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
}
當然,需要捕獲或宣告異常被丟擲。有幾點需要注意這段程式碼:
postTarget
是 POST 的目標 URL;oauthToken
是身份驗證令牌;fileDescription
是檔案的描述,它作為欄位description
的值傳送;file
是要傳送的檔案 - 它的型別為java.io.File
- 如果你有檔案路徑,你可以使用new File(filePath)
代替。- 它為 oAuth auth 設定了
Authorization
標頭 - 它使用 Apache Common
FileUtil
將檔案讀入位元組陣列 - 如果你已經將檔案內容以位元組陣列或其他方式儲存在記憶體中,則無需讀取它。