springboot接受表單multpartFile並使用HttpClient發送post請求模擬表單上傳文件(multipart/form-data)

現在有個需求,就是表單那邊提交上來文件,我後臺需要獲取文件流並向另一個服務器發起請求將文件傳給另一個服務器。

後臺使用springboot,spring接收文件流一般都會轉換成MultipartFile類型

maven:

 <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.10</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.3.2</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

 

// 上傳文件
@RequestMapping(value = "upload1")
@ResponseBody
public Object upload1(
        @RequestParam(value = "files") MultipartFile[] files,  //這樣接收文件
        @RequestParam(value = "file")  MultipartFile file,  //這樣接收文件
        @RequestParam Map<String,Object> params,
        HttpServletRequest request
) {
    RetBase ret = new RetBase();
    
    File file2 = null;
    String fileName = file.getOriginalFilename();
    String prefix = fileName.substring(fileName.lastIndexOf("."));
    List<Map<String,Object>> data = new ArrayList<>();
    try {
        file2 = File.createTempFile(fileName, prefix);
        // 將上傳文件複製到臨時文件
        //Springboot中直接用transferTo會報找不到路徑的錯,得複製一份才行
        FileUtils.copyInputStreamToFile(file.getInputStream(),file2);
        HashMap param = new HashMap();
        //調用遠程發送接口
        String content=getRemoteInterfaceStr("upload",param,file2);
        // 返回前臺
        ret.setData(data);
        ret.setCode("0");
        ret.setMsg("上傳成功");
        ret.setSuccess(true);
        return ret;

    } catch (Exception e) {
        e.printStackTrace();
        ret.setCode("-10");
        ret.setMsg("上傳失敗");
        ret.setSuccess(false);
        return ret;
    }

}
public String getRemoteInterfaceStr1(String actionName,HashMap params,File file1) {
    CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpPost post = new HttpPost("http://test.cnmaker.top/data.cfrc?action=" + actionName);
    try {
        // 將上傳文件複製到臨時文件
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        ContentType strContent = ContentType.create("text/plain", Charset.forName("UTF-8"));
        builder.addTextBody("attachmentType","certificate" , strContent);
        FileBody bin = new FileBody(file1);
        builder.addPart("file", bin);
        //傳文字參數
        // builder.addPart("attachmentType",
        //         new StringBody("certificate", ContentType.create("text/plain", Consts.UTF_8)));
        HttpEntity parameterEntity = builder.build();
        //這裏不要自己制定header,它會自己模擬,你自己指定了就會報錯
        //post.setHeader("Content-type", "multipart/form-data");
        post.setEntity(parameterEntity);
        CloseableHttpResponse response = httpClient.execute(post, HttpClientContext.create());
        String content = EntityUtils.toString(response.getEntity());
        //插入對應的表

        return content;
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        // 操作完上面的文件 需要刪除在根目錄下生成的臨時文件
        MultipartFileToFile.deleteTempFile(file1);
    }
    return null;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章