之前寫過基于html和js的文件上傳方法java 用springMVC 和HttpServletRequest 兩種實現文件上傳的方法和httpClient后臺執行普通post請求的文章java通過httpClient從接口請求數據入庫以及自動生成實體工具類,最近接到一個需求,需要用到后臺去調用遠程服務器的文件上傳接口實現文件上傳,用到了httpClient的MultipartEntityBuilder實現。
maven引入httpClient依賴
org.apache.httpcomponents
httpcore
4.4.13
org.apache.httpcomponents
httpclient
4.5.12
org.apache.httpcomponents
httpmime
4.5.12
以上依賴是筆者成文時maven最新的依賴包。
新建一個UploadFileUtil工具類:
package com.zhaohy.app.utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UpLoadFileUtil {
private static Logger logger = LoggerFactory.getLogger(UpLoadFileUtil.class);
/**
* 通過httpClient上傳文件
* @param fileName
* @param path
* @return 外部域名的下載url
*/
public static String UploadFileByHttpClient(String fileName,String path, String url) {
String result = "";
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
HttpPost httpPost = new HttpPost(url);
//HttpMultipartMode.RFC6532參數的設定是為避免文件名為中文時亂碼
MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
httpPost.addHeader("header1", "111");//頭部放文件上傳的head可自定義
File file = new File(path+fileName); //上傳文件的路徑
builder.addBinaryBody("file", file, ContentType.MULTIPART_FORM_DATA, fileName);
builder.addTextBody("params1", "1");//其余參數,可自定義
builder.addTextBody("params2", "2");
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);// 執行提交
HttpEntity responseEntity = response.getEntity();//接收調用外部接口返回的內容
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
// 返回的內容都在content中
InputStream content = responseEntity.getContent();
// 定義BufferedReader輸入流來讀取URL的響應
BufferedReader in = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
if(!AppFrameworkUtil.isBlank(result)) {
logger.info("上傳文件"+fileName+"返回參數==>"+result);
}else {
logger.error("上傳文件失敗:返回result為null");
}
}
}catch(Exception e) {
logger.error("上傳文件失敗:",e);
}finally {//處理結束后關閉httpclient的鏈接
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
}
上面代碼中 fileName是文件名稱,本地文件路徑,url是遠程上傳接口url,通過httpPost.addHeader來自定義header參數,builder.addTextBody來自定義其他參數,相當于html中form表單中其他的參數,可解析返回來的result拿到自己想拿的信息。