1. 程式人生 > >HttpClient中轉上傳檔案

HttpClient中轉上傳檔案

***************************************************

場景:客戶端(瀏覽器)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;
    }