HttpClient中轉上傳檔案
阿新 • • 發佈:2018-12-09
***************************************************
場景:客戶端(瀏覽器)A---->選擇檔案上傳---->伺服器B---->中轉檔案---->伺服器C---->返回結果---->伺服器B---->客戶端A
有時候在專案中需要把上傳的檔案中轉到第三方伺服器,第三方伺服器提供一個接收檔案的介面。
而我們又不想把檔案先上傳到伺服器儲存後再通過File來讀取檔案上傳到第三方伺服器,我們可以使用HttpClient來實現。
因為專案使用的是Spring+Mybatis框架,檔案的上傳採用的是MultipartFile,而FileBody只支援File。
所以這裡採用MultipartEntityBuilder的addBinaryBody方法以資料流的形式上傳。
這裡需要引入兩個jar包:httpclient-4.4.jar和httpmime-4.4.jar
Maven pom.xml引入
複製程式碼 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.4</version> </dependency>
上傳程式碼:
/** * 中轉檔案 * * @param file * 上傳的檔案 * @return 響應結果 */ public String httpClientUploadFile(MultipartFile file) { final String remote_url = "http://192.168.1.99:8080/demo/file/upload";// 第三方伺服器請求地址 CloseableHttpClient httpClient = HttpClients.createDefault(); String result = ""; try { String fileName = file.getOriginalFilename(); HttpPost httpPost = new HttpPost(remote_url); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);// 檔案流 builder.addTextBody("filename", fileName);// 類似瀏覽器表單提交,對應input的name和value HttpEntity entity = builder.build(); httpPost.setEntity(entity); HttpResponse response = httpClient.execute(httpPost);// 執行提交 HttpEntity responseEntity = response.getEntity(); if (responseEntity != null) { // 將響應內容轉換為字串 result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8")); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } return result; }