這輩子沒辦法作太多事情,因此每一件都要作到精彩絕倫!html
People can't do too many things in my life,so everything will be wonderful spring
項目使用技術SpringMVC + spring + mybatisapache
該工具類封裝了get、post、put、delete以及post上傳多個文件等方法;包含了有無參數。平常開發,夠用了!瀏覽器
通常來講,有些公司會有本身獨立的上傳下載文件服務器;有些是單應用服務!以上這兩種狀況,暫用不到該方法。安全
本文重點講解使用httpClient進行post請求多文件上傳功能(底層是模擬表單提交)。服務器
依賴包及版本mybatis
<dependency>jsp
<groupId>org.apache.httpcomponents</groupId>分佈式
<artifactId>httpclient</artifactId>ide
<version>4.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.3.5</version>
</dependency>
方法代碼:
//注入httpClient和requestConfig(spring集成httpClient配置)
@Autowired
privateCloseableHttpClient httpClient;
@Autowired
privateRequestConfig requestConfig;
/**
*
* @描述:httpCilent多圖片上傳和多個參數
* @建立人:wyait
* @建立時間:2017年5月2日 下午1:47:41
* @param url 請求url
* @param params 請求參數
* @param files file對象
* @return
* @throws IOException
*/
publicHttpResult postUploadFile(String url, Map<String, Object> params,
Map<String,File> files) throws IOException {
HttpPosthttpPost = new HttpPost(url);// 建立 HTTP POST 請求
httpPost.setConfig(this.requestConfig);
MultipartEntityBuilderbuilder = MultipartEntityBuilder.create();
builder.setCharset(Charset.forName("UTF-8"));//設置請求的編碼格式
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//設置瀏覽器兼容模式
//設置參數
if(files != null) {
//設置圖片參數
for(Map.Entry<String, File> entry : files.entrySet()) {
builder.addBinaryBody(entry.getKey(),entry.getValue());
}
}
//設置參數
if(params != null) {
//設置post參數
for(Map.Entry<String, Object> entry : params.entrySet()) {
//指定編碼,防止中文亂碼問題。可是某些狀況下會致使上傳失敗
builder.addTextBody(entry.getKey(),
String.valueOf(entry.getValue()),
ContentType.create("text/plain","UTF-8"));
}
}
//生成 HTTP POST 實體
HttpEntityentity = builder.build();
//設置請求參數
httpPost.setEntity(entity);
CloseableHttpResponseresponse = null;
try{
//執行請求
response= httpClient.execute(httpPost);
if(response.getEntity() != null) {
returnnew HttpResult(response.getStatusLine().getStatusCode(),
EntityUtils.toString(response.getEntity(),"UTF-8"));
}
returnnew HttpResult(response.getStatusLine().getStatusCode(),
null);
}finally {
if(response != null) {
response.close();
}
}
}
現有A前臺系統和B服務系統;業務流程:
JSP頁面提交文件—>A系統(發送httpClient)—>B系統進行更新數據!
考慮的方案:
1,直接跳過A系統,jsp頁面請求B更新數據;
2,A系統進行文件保存後,將路徑帶到B系統進行更新操做;
以上兩種方案的問題點;
方案1,線上B服務,通常是內網服務,不對外開放;不然會有安全問題;
方案2,涉及分佈式事務問題;
在網上也百度了不少方法,最終退而求其次,進行兩次讀寫操做,更新數據!
此處略
主要功能是:A系統接收文件,合法性校驗後,對圖片進行判斷和壓縮處理,生成一個臨時文件;
對於對圖片的判斷處理這裏就不作過多說明了。
重點說一下:
MultipartFile 轉成 File對象實現(結合網上資料,總結出最佳實踐):
Stringpath=」自定義」+MultipartFile. getOriginalFilename();
File newFile=new File(path);
//直接寫文件到指定路徑下
MultipartFile.transferTo(newFile);
主要功能是:調用httpClient已經封裝好的postUploadFile(ur,params,files)方法,發送請求;
Map<String, File> files = new HashMap<String, File>();
files.put("newFile", newFile);
//發送請求,並對請求數據進行處理,params自定義
Obj 自定義=httpCilentService.postUploadFile(url, params, files);
B系統經過MultipartFile接收文件數據,並進行更新操做,返回結果;
接收文件:
保存文件:
// 新file
FilenewFile = new File(newFile);
//寫文件到磁盤
newPic.transferTo(newFile);
A系統在調用B系統後,不管結果ok,仍是fail。都刪除臨時圖片;
將該段代碼寫在finally代碼塊中:
boolean flag = new File(path).delete();
if(!flag) {
//刪除原始圖片失敗
return"刪除臨時圖片失敗,請稍後再試";
}
最後,返回結果到jsp頁面
關於HttpClient工具類最好連接:http://blog.csdn.net/column/details/httpclient-arron.html