httpclient 單附件上傳實例 (擴展多附件上傳實例,點我)
/**
* 上傳附件
* @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); //獲取resources下的資源文件
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();
}
}
}
調用方法
/**
* @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)
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() |
