httpclient 上傳附件實例java
/** * 上傳附件 * @param host * @param uri * @param filePath 文件路徑 * @param name 服務端定義的附件名 * @param param 請求帶的參數 * @return */ public String upload(String host, String uri, String filePath,String name, Map<String, String> param) { logger.info("*****************request*****************"); CloseableHttpClient httpClient = null; CloseableHttpResponse response = null; String url = host + uri ; String rst = ""; try { httpClient = HttpClients.createDefault(); logger.info("請求路徑: "+ url); HttpPost httpPost = new HttpPost(url); //經過當前類的加載器來加載資源,調用getResourceAsStream()是保證和類類型同一個加載器加載 InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath); File file = new File(filePath); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); //建立MultipartEntityBuilder對象 //添加上傳的二進制文件 builder.addBinaryBody(name, inputStream, ContentType.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(); } } }
調用方法web
/** * @description: TODO 上傳圖片 * @author : xxx * @date 2019/6/6 11:15 */ public String uploadImage() throws Exception { Map<String, String> params = new HashMap<>(); params.put("uploadType","1"); //文件放置resources目錄下, 服務端定義接收附件名稱爲 imageFile String rst = upload("http://xxxx.com","/web/upload","picture/repaymentPic.jpg","imageFile",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)ui
MultipartEntityBuilder用法this
2.MultipartEntityBuilder這個類主要用於建立HttpEntity。它的主要方法有:編碼
修飾符和類型url |
方法和描述spa |
MultipartEntityBuilder.net |
addBinaryBody(String name, byte[] b) orm 將字節數組以二進制的形式添加數據。 |
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() |