公共方法:
public static String fileUpload(String url, Header[] headers, Map<String, Object> params, String boundary) throws Exception {
String result;
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
try {
httpClient = HttpClients.createDefault();
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create()
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.setBoundary("--------------------" + boundary)
.setCharset(Charset.defaultCharset());
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, Object> entry : params.entrySet()) {
if (entry.getValue() instanceof File) {
multipartEntityBuilder.addPart(entry.getKey(), new FileBody((File) entry.getValue()));
} else {
multipartEntityBuilder.addPart(entry.getKey(), new StringBody(entry.getValue().toString(), ContentType.create("text/plain", Charset.defaultCharset())));
}
}
}
HttpPost request = new HttpPost(url);
request.setEntity(multipartEntityBuilder.build());
request.setHeaders(headers);
response = httpClient.execute(request);
HttpEntity entry = response.getEntity();
int code = response.getStatusLine().getStatusCode();
System.out.println("StatusCode: " + code);
result = EntityUtils.toString(entry);
} finally {
HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
return result;
}
调用示例:
@Test
public void uploadFile() throws Exception {
String uri = "/api/file/uploadFile";
String url = BASE_URL + uri;
List<Header> headList = new ArrayList<>();
String boundary = UUID.randomUUID().toString(true);
headList.add(new BasicHeader("Content-Type", "multipart/form-data; boundary=--------------------" + boundary));
headList.add(new BasicHeader("token", TOKEN));
headList.add(new BasicHeader("account", "1234567890"));
Map<String, Object> params = new HashMap<>();
params.put("field1", boundary);
params.put("field2", 1);
File file = new File("C:\\Users\\Administrator\\Pictures\\123.png");
params.put("uploadFile", file);
System.out.println(HaozhaoTools.fileUpload(url, headList.toArray(new Header[0]), params, boundary));
}
要点:header中的Content-Type为"multipart/form-data; boundary=--------------------" + boundary,boundary的值需要和multipartEntityBuilder的boundary一致。