使用 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
将文件读入字节数组 - 如果你已经将文件内容以字节数组或其他方式存储在内存中,则无需读取它。