Java使用HttpClient以multipart/form-data向接口上传文件

打印 上一主题 下一主题

主题 772|帖子 772|积分 2316

前言

对接某公司的接口,涉及到资质上传等业务。需要对接他们的上传附件接口。
JDK1.8 httpclient 4.x
封装httpclient方法
  1. public static String postFileMultiPart(String url,Map<String, ContentBody> reqParam) throws IOException{
  2.         CloseableHttpClient httpclient = HttpClients.createDefault();
  3.         try {
  4.                 // 创建http
  5.                 HttpPost httppost = new HttpPost(url);
  6.                 //setConnectTimeout:设置连接超时时间,单位毫秒。setConnectionRequestTimeout:设置从connect Manager获取Connection 超时时间,单位毫秒。
  7.                 RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(5000).setConnectionRequestTimeout(5000).setSocketTimeout(15000).build();
  8.                 httppost.setConfig(defaultRequestConfig);
  9.                 MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
  10.                 for(Map.Entry<String,ContentBody> param : reqParam.entrySet()){
  11.                         multipartEntityBuilder.addPart(param.getKey(), param.getValue());
  12.                 }
  13.                 HttpEntity reqEntity = multipartEntityBuilder.build();
  14.                 httppost.setEntity(reqEntity);
  15.                 // 执行post请求.
  16.                 CloseableHttpResponse response = httpclient.execute(httppost);
  17.                 System.out.println("got response");
  18.                 try {
  19.                         // 获取响应实体
  20.                         HttpEntity entity = response.getEntity();
  21.                         if (entity != null) {
  22.                                 return EntityUtils.toString(entity, Charset.forName("UTF-8"));
  23.                         }
  24.                 } finally {
  25.                         response.close();
  26.                 }
  27.         } finally {
  28.                 // 关闭连接,释放资源
  29.                 try {
  30.                         httpclient.close();
  31.                 } catch (IOException e) {
  32.                         e.printStackTrace();
  33.                 }
  34.         }
  35.         return null;
  36. }
复制代码
因为我方系统需要给前端提供上传接口 使用的MultipartFile来接收文件
所以这边需要MultipartFile转下File文件
  1. public static File transferToFile(MultipartFile multipartFile) {
  2.         //选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 。
  3.         File file = null;
  4.         try {
  5.                 String originalFilename = multipartFile.getOriginalFilename();
  6.                 //获取文件后缀
  7.                 String prefix = originalFilename.substring(originalFilename.lastIndexOf("."));
  8.                 file = File.createTempFile(originalFilename, prefix);
  9.                 multipartFile.transferTo(file);
  10.                 //删除临时文件
  11.                 file.deleteOnExit();
  12.         } catch (IOException e) {
  13.                 e.printStackTrace();
  14.         }
  15.         return file;
  16. }
复制代码
方法调用
  1. public RestResponse attachment(MultipartFile file) throws Exception {
  2.         Map<String, ContentBody> reqParam = new HashMap<>();
  3.         //普通类型
  4.         reqParam.put("appId", new StringBody("appid", ContentType.MULTIPART_FORM_DATA));
  5.         //文件
  6.         reqParam.put("file", new FileBody(FileUploadUtils.transferToFile(file), ContentType.IMAGE_JPEG));
  7.         String result = HttpClientUtil.postFileMultiPart("http://www.com/attachment", reqParam);
  8. }
复制代码
后记

一顿操作对接完事。肯定有朋友问 为什么不让前端兄弟直接对接呢。因为对接的接口有权限校验。前端直接调会有泄漏token和秘钥的风险。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表