HttpClient post提交multipart/form-data数据实现文件上传

业务需求:使用HttpClient 调用第三方接口传文件参数

工具类:

/**
     * @Auther: yaohongan
     * @Description //上传文件
     * @Date: 2019/12/17 8:54
     */
    public static Map<String, String> sendMultipartFilePost( String url, MultipartFile multipartFile, String fileParName,
                                                             Map<String, Object> params, int timeout) {
        Map<String, String> resultMap = new HashMap<String, String>();
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String result = "";
        try {
            HttpPost httpPost = new HttpPost(url);
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.setCharset(java.nio.charset.Charset.forName("UTF-8"));
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            String fileName = null;
            fileName = multipartFile.getOriginalFilename();
            builder.addBinaryBody(fileParName, multipartFile.getBytes(), ContentType.MULTIPART_FORM_DATA, fileName);// 文件流
            //解决中文乱码
//            ContentType contentType = ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                if(entry.getValue() == null) {
                    continue;
                }
                // 类似浏览器表单提交,对应input的name和value
                builder.addTextBody(entry.getKey(), entry.getValue().toString());
            }
            HttpEntity entity = builder.build();
            httpPost.setEntity(entity);
            HttpResponse response = httpClient.execute(httpPost);// 执行提交

            // 设置连接超时时间
//            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout)
//                    .setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build();
//            httpPost.setConfig(requestConfig);

            HttpEntity responseEntity = response.getEntity();
            resultMap.put("scode", String.valueOf(response.getStatusLine().getStatusCode()));
            resultMap.put("data", "");
            if (responseEntity != null) {
                // 将响应内容转换为字符串

                result = EntityUtils.toString(responseEntity, java.nio.charset.Charset.forName("UTF-8"));
                resultMap.put("data", result);
                ((CloseableHttpResponse) response).close();
            }
            httpPost.releaseConnection();
            httpClient.close();
        } catch (Exception e) {
            resultMap.put("scode", "error");
            resultMap.put("data", "HTTP请求出现异常: " + e.getMessage());
            Writer w = new StringWriter();
            e.printStackTrace(new PrintWriter(w));
        }

        return resultMap;
    }

使用案例:

service层

public Map<String, Object> imageCheck2(MultipartFile imgFile) throws IOException {
		Map<String, Object> resultMap = new HashMap<String, Object>();
		if(imgFile==null){
			resultMap.put("ret", "-1");
			resultMap.put("msg", "文件未上传");
			return resultMap;
		}
		Map<String, Object> data = new HashMap<>();
		String url = ConfigPropertiesUtil.getValue("image_Check") ;
		Map<String, String> resultDataMap = HttpClientUtil.sendMultipartFilePost(url,imgFile,"file", data, -1);
		String str = resultDataMap.get("data");
		str = str.replaceAll("\"","");
		resultMap.put("ret", "0");
		resultMap.put("msg", "SUCCESS");
		resultMap.put("body", str);// 数据结果
		return resultMap;
		
	}

controller层

@RequestMapping(value = "/imageCheck2", produces = "application/json;charset=utf-8")
	@ResponseBody
	public Map<String, Object> imageCheck2(MultipartFile image) throws IOException {
		Map<String, Object> resultMap = checkService.imageCheck2(image);
		return resultMap;
	}

结果数据

发布了30 篇原创文章 · 获赞 20 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/YiWangJiuShiXingFu/article/details/103579376