public static String upload(String url, Map<String, String> headers, Map<String, Object> params) {
try {
String BOUNDARY = UUID.randomUUID().toString();
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setConnectTimeout(CONNECT_TIMEOUT);
connection.setReadTimeout(READ_TIMEOUT);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (headers != null) {
Set<String> keys = headers.keySet();
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String value = headers.get(key);
connection.addRequestProperty(key, value);
}
}
connection.addRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
boolean first = true;
if (params != null) {
Set<String> keys = params.keySet();
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
Object value = params.get(key);
baos.write(buildBoundary(BOUNDARY, first, false));
baos.write(buildHeader(key, value));
first = false;
if (value instanceof String) {
baos.write((value + "\r\n").getBytes("UTF-8"));
} else if (value instanceof File) {
FileInputStream fis = new FileInputStream((File) value);
byte[] bytes = new byte[4096];
int hasRead;
while ((hasRead = fis.read(bytes)) != -1) {
baos.write(bytes, 0, hasRead);
}
}
}
}
baos.write(buildBoundary(BOUNDARY, first, true));
OutputStream os = connection.getOutputStream();
os.write(baos.toByteArray());
int status = connection.getResponseCode();
InputStream is;
if (status >= 400) {
is = connection.getErrorStream();
} else {
is = connection.getInputStream();
}
InputStreamReader isr = new InputStreamReader(is);
BufferedReader bufr = new BufferedReader(isr);
String line;
StringBuilder sb = new StringBuilder();
while ((line = bufr.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}