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