HttpClient多文件上傳

這輩子沒辦法作太多事情,因此每一件都要作到精彩絕倫!html

People can't do too many things in my life,so everything will be wonderful  spring

 

項目使用技術SpringMVC + spring + mybatisapache

HttpClient技術

1       HttpClientService工具類

該工具類封裝了getpostputdelete以及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>

  • 方法代碼:

//注入httpClientrequestConfig(spring集成httpClient配置)

@Autowired

         privateCloseableHttpClient httpClient;

 

         @Autowired

         privateRequestConfig requestConfig;

/**

          *

          * @描述:httpCilent多圖片上傳和多個參數

          * @建立人:wyait

          * @建立時間:201752 下午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();

                            }

                   }

         }

2       業務場景

現有A前臺系統和B服務系統;業務流程:

JSP頁面提交文件—>A系統(發送httpClient)—>B系統進行更新數據!

考慮的方案:

1,直接跳過A系統,jsp頁面請求B更新數據;

2A系統進行文件保存後,將路徑帶到B系統進行更新操做;

以上兩種方案的問題點;

方案1,線上B服務,通常是內網服務,不對外開放;不然會有安全問題;

方案2,涉及分佈式事務問題;

在網上也百度了不少方法,最終退而求其次,進行兩次讀寫操做,更新數據!

 

3       實現流程

3.1    jsp頁面上傳文件

此處略

3.2    A系統處理文件

主要功能是:A系統接收文件,合法性校驗後,對圖片進行判斷和壓縮處理,生成一個臨時文件;

對於對圖片的判斷處理這裏就不作過多說明了。

重點說一下:

MultipartFile 轉成 File對象實現(結合網上資料,總結出最佳實踐):

                   Stringpath=」自定義」+MultipartFile. getOriginalFilename();

File newFile=new File(path);

        //直接寫文件到指定路徑下

        MultipartFile.transferTo(newFile);

 

3.3    調用httpCilent發送請求

主要功能是:調用httpClient已經封裝好的postUploadFileur,params,files)方法,發送請求;

Map<String, File> files = new HashMap<String, File>();

                   files.put("newFile", newFile);

                   //發送請求,並對請求數據進行處理,params自定義

Obj 自定義=httpCilentService.postUploadFile(url, params, files);

3.4    B系統處理數據

B系統經過MultipartFile接收文件數據,並進行更新操做,返回結果;

  • 接收文件:

wKiom1kJpauCPv0sAAAzA8jtxjs447.png

  • 保存文件:

// file

                            FilenewFile = new File(newFile);

                            //寫文件到磁盤

                            newPic.transferTo(newFile);

3.5    A系統回調處理數據

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

相關文章
相關標籤/搜索