下面是我使用 HttpURLConnection 类实现的 MULTIPART 表单数据上传。此类采用动态用法,因此可以使用不同的数据集一次调用多个请求。注意:我将 json 部分分解为单独的文本形式,以保持与我的服务器的一致性。您可以修改它以匹配您的服务器要求。
public class WebConnector {
String boundary = "-------------" + System.currentTimeMillis();
private static final String LINE_FEED = "\r\n";
private static final String TWO_HYPHENS = "--";
private StringBuilder url;
private String protocol;
private HashMap<String, String> params;
private JSONObject postData;
private List<String> fileList;
private int count = 0;
private DataOutputStream dos;
public WebConnector(StringBuilder url, String protocol,
                    HashMap<String, String> params, JSONObject postData) {
    super();
    this.url = url;
    this.protocol = protocol;
    this.params = params;
    this.postData = postData;
    createServiceUrl();
}
public WebConnector(StringBuilder url, String protocol,
                    HashMap<String, String> params, JSONObject postData, List<String> fileList) {
    super();
    this.url = url;
    this.protocol = protocol;
    this.params = params;
    this.postData = postData;
    this.fileList = fileList;
    createServiceUrl();
}
public String connectToMULTIPART_POST_service(String postName) {
    System.out.println(">>>>>>>>>url : " + url);
    StringBuilder stringBuilder = new StringBuilder();
    String strResponse = "";
    InputStream inputStream = null;
    HttpURLConnection urlConnection = null;
    try {
        urlConnection = (HttpURLConnection) new URL(url.toString()).openConnection();
        urlConnection.setRequestProperty("Accept", "application/json");
        urlConnection.setRequestProperty("Connection", "close");
        urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 ( compatible ) ");
        urlConnection.setRequestProperty("Authorization", "Bearer " + Config.getConfigInstance().getAccessToken());
        urlConnection.setRequestProperty("Content-type", "multipart/form-data; boundary=" + boundary);
        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);
        urlConnection.setUseCaches(false);
        urlConnection.setChunkedStreamingMode(1024);
        urlConnection.setRequestMethod("POST");
        dos = new DataOutputStream(urlConnection.getOutputStream());
        Iterator<String> keys = postData.keys();
        while (keys.hasNext()) {
            try {
                String id = String.valueOf(keys.next());
                addFormField(id, "" + postData.get(id));
                System.out.println(id + " : " + postData.get(id));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        try {
            dos.writeBytes(LINE_FEED);
            dos.flush();
            dos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (fileList != null && fileList.size() > 0 && !fileList.isEmpty()) {
            for (int i = 0; i < fileList.size(); i++) {
                File file = new File(fileList.get(i));
                if (file != null) ;
                addFilePart("photos[" + i + "][image]", file);
            }
        }
        // forming th java.net.URL object
        build();
        urlConnection.connect();
        int statusCode = 0;
        try {
            urlConnection.connect();
            statusCode = urlConnection.getResponseCode();
        } catch (EOFException e1) {
            if (count < 5) {
                urlConnection.disconnect();
                count++;
                String temp = connectToMULTIPART_POST_service(postName);
                if (temp != null && !temp.equals("")) {
                    return temp;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 200 represents HTTP OK
        if (statusCode == HttpURLConnection.HTTP_OK) {
            inputStream = new BufferedInputStream(urlConnection.getInputStream());
            strResponse = readStream(inputStream);
        } else {
            System.out.println(urlConnection.getResponseMessage());
            inputStream = new BufferedInputStream(urlConnection.getInputStream());
            strResponse = readStream(inputStream);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (null != inputStream)
                inputStream.close();
        } catch (IOException e) {
        }
    }
    return strResponse;
}
public void addFormField(String fieldName, String value) {
    try {
        dos.writeBytes(TWO_HYPHENS + boundary + LINE_FEED);
        dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"" + LINE_FEED + LINE_FEED/*+ value + LINE_FEED*/);
        /*dos.writeBytes("Content-Type: text/plain; charset=UTF-8" + LINE_FEED);*/
        dos.writeBytes(value + LINE_FEED);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public void addFilePart(String fieldName, File uploadFile) {
    try {
        dos.writeBytes(TWO_HYPHENS + boundary + LINE_FEED);
        dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\";filename=\"" + uploadFile.getName() + "\"" + LINE_FEED);
        dos.writeBytes(LINE_FEED);
        FileInputStream fStream = new FileInputStream(uploadFile);
        int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];
        int length = -1;
        while ((length = fStream.read(buffer)) != -1) {
            dos.write(buffer, 0, length);
        }
        dos.writeBytes(LINE_FEED);
        dos.writeBytes(TWO_HYPHENS + boundary + TWO_HYPHENS + LINE_FEED);
    /* close streams */
        fStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public void addHeaderField(String name, String value) {
    try {
        dos.writeBytes(name + ": " + value + LINE_FEED);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public void build() {
    try {
        dos.writeBytes(LINE_FEED);
        dos.flush();
        dos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
private static String readStream(InputStream in) {
    StringBuilder sb = new StringBuilder();
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String nextLine = "";
        while ((nextLine = reader.readLine()) != null) {
            sb.append(nextLine);
        }
    /* Close Stream */
        if (null != in) {
            in.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return sb.toString();
}
private void createServiceUrl() {
    if (null == params) {
        return;
    }
    final Iterator<Map.Entry<String, String>> it = params.entrySet().iterator();
    boolean isParam = false;
    while (it.hasNext()) {
        final Map.Entry<String, String> mapEnt = (Map.Entry<String, String>) it.next();
        url.append(mapEnt.getKey());
        url.append("=");
        try {
            url.append(URLEncoder.encode(mapEnt.getValue(), "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        url.append(WSConstants.AMPERSAND);
        isParam = true;
    }
    if (isParam) {
        url.deleteCharAt(url.length() - 1);
    }
}
}