多附件上傳實例:
/*** 多附件上傳* @param host* @param uri* @param attachment 附件* @param param body參數* @return*/public String upload(String host, String uri, Map<String,String> attachment, Map<String, String> param) {logger.info("*****************request*****************");CloseableHttpClient httpClient = null;CloseableHttpResponse response = null;MultipartEntityBuilder builder = MultipartEntityBuilder.create();;File file = null;InputStream inputStream = null;String url = host + uri;String rst = "";try {httpClient = HttpClients.createDefault();logger.info("請求路徑: "+ url);HttpPost httpPost = new HttpPost(url);for(String fileName:attachment.keySet()){inputStream = this.getClass().getClassLoader().getResourceAsStream(attachment.get(fileName)); //獲取resources下的資源文件file = new File(attachment.get(fileName));builder.addBinaryBody(fileName, inputStream, create("multipart/form-data", Consts.UTF_8), file.getName());}for (Map.Entry<String, String> entry : param.entrySet()) {String key = entry.getKey();String value = entry.getValue();StringBody stringBody = new StringBody(value, create("text/plain", Consts.UTF_8));builder.addPart(key, stringBody);logger.info("請求參數:"+key+":"+ value);}HttpEntity reqEntity = builder.build();httpPost.setEntity(reqEntity);// 發起請求 并返回請求的響應response = httpClient.execute(httpPost);// 獲取響應對象HttpEntity resEntity = response.getEntity();if (resEntity != null) {// 打印響應內容rst = EntityUtils.toString(resEntity, Charset.forName("UTF-8")) ;logger.info("*****************response*****************");logger.info("響應結果: " +rst);}// 銷毀EntityUtils.consume(resEntity);return rst;} catch (Exception e) {logger.info("出錯啦: "+e.getMessage());e.printStackTrace();return "出錯了";} finally {try {if (response != null) {response.close();}} catch (IOException e) {e.printStackTrace();}try {if (httpClient != null) {httpClient.close();}} catch (IOException e) {e.printStackTrace();}}}
調用方法
public String uploadImage () throws Exception {Map<String, String> params = new HashMap<>();params.put("uploadType", "1");params.put("repayReason", "測試數據");Map<String, String> attachment= new HashMap<>();attachment.put("imageFile","picture/repayPic.jpg"); //該附件放在resources包下的picture包里面attachment.put("images","picture/repay.jpg");String rst = baseRequest.upload("http://xxxx.com","/web/upload", attachment, params);return rst;
}
請求類型表:查看
1.設置上傳的模式;
setMode(HttpMultipartMode mode),其中mode主要有BROWSER_COMPATIBLE,RFC6532,STRICT三種,默認值是STRICT。
2.創建MultipartEntityBuilder對象,并添加需要上傳的數據;
a.利用MultipartEntityBuilder.create()來創建對象;
b.addBinaryBody:以二進制的形式添加數據,可以添加File、InputStream、byte[]類型的數據。
addBinaryBody(String name, File file, ContentType contentType, String filename)
addBinaryBody(String name, InputStream stream, ContentType contentType, String filename)
addBinaryBody(String name, byte[] b, ContentType contentType, String filename)
c.addTextBody:添加文本數據
addTextBody(String name, String text, ContentType contentType)
d.addPart:以Key/Value的形式添加ContentBody類型的數據
addPart(String name, ContentBody contentBody)
MultipartEntityBuilder用法
2.MultipartEntityBuilder這個類主要用于創建HttpEntity。它的主要方法有:
修飾符和類型 | 方法和描述 |
MultipartEntityBuilder | addBinaryBody(String?name, byte[]?b)? 將字節數組以二進制的形式添加數據。 |
MultipartEntityBuilder | addBinaryBody(String?name, byte[]?b,?ContentType?contentType,?String?filename)? 將字節數組以二進制的形式添加數據。 |
MultipartEntityBuilder | addBinaryBody(String?name,?File?file)? 將文件以二進制的形式添加數據。 |
MultipartEntityBuilder | addBinaryBody(String?name,?File?file,?ContentType?contentType,?String?filename)? 將文件以二進制的形式添加數據。 |
MultipartEntityBuilder | addBinaryBody(String?name,?InputStream?stream)? |
MultipartEntityBuilder | addBinaryBody(String?name,?InputStream?stream,?ContentType?contentType,?String?filename)? 將輸入流以二進制的形式添加數據。 |
MultipartEntityBuilder | addPart(String?name,?ContentBody?contentBody)? 添加ContentBody?類型的數據。 |
MultipartEntityBuilder | addTextBody(String?name,?String?text)? 添加文本數據。 |
MultipartEntityBuilder | addTextBody(String?name,?String?text,?ContentType?contentType)? 以指定的內容類型添加文本數據。 |
HttpEntity | build()? 創建一個HttpEntity。 |
static?MultipartEntityBuilder | create()? 創建一個MultipartEntityBuilder對象。 |
MultipartEntityBuilder | setBoundary(String?boundary)? 設置邊界。 |
MultipartEntityBuilder | setCharset(Charset?charset)? 設置請求的編碼格式。 |
MultipartEntityBuilder | setLaxMode()? |
MultipartEntityBuilder | setMode(HttpMultipartMode?mode)? 設置模式。 |
MultipartEntityBuilder | setStrictMode()? |