multipart/form-data格式接口调用工具类,实现文件上传

2023-10-31

1、添加依赖

    <dependencies>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
        </dependency>
    </dependencies>

2、举例工具类(具体请求参数自调)

package com.xpf.utils;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.util.HashMap;

public class MulFormDataUtils {


    /**
     * multipart/form-data格式接口调用
     * @param headMap 请求头(自行根据调用接口封装)
     * @param url
     * @param paramMap 请求参数(自行根据调用接口封装)
     * @param inputStream
     * @return
     */
    public static String doPostUploadFile(HashMap<String, Object> headMap, String url, HashMap<String, Object> paramMap, InputStream inputStream){

        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost post = new HttpPost();

        try {
            URIBuilder urlBuilder = new URIBuilder(url);
            post.setURL(urlBuilder.build());
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        
        //封装请求头head
        //( 千万千万不要把 "Content-Type":"multipart/form-data" 封装进请求头,否则会请求出错 )
        //以下举例三条,根据需要调的接口的实际情况封装
        //headMap.put("x-qys-accesstoken", accessToken);
        //headMap.put("x-qys-timestamp", String.valueOf(timestamp));
        //headMap.put("x-qys-signature", md5Str);
        headMap.entrySet().forEach(p -> post.setHeader(p.getKey(), String.valueOf(p.getValue()) ));

        //解决中文乱码问题
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setCharset(Charset.forName("UTF-8"));
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        builder.addBinaryBody("file", inputStream, ContentType.DEFAULT_BINARY.withCharset("UTF-8"), String.valueOf(paramMap.get("title")));

        //(这个是要调的接口的参数,根据实际情况组装)解决文件名中文乱码(???)
        builder.addTextBody("title", String.valueOf(paramMap.get("title")), ContentType.DEFAULT_TEXT.withCharset("UTF-8"));
        builder.addTextBody("fileType", String.valueOf(paramMap.get("fileType")));

        HttpEntity entity = builder.build();
        post.setEntity(entity);
        String result = null;

        try {
            HttpResponse response = client.execute(post);
            result = EntityUtils.toString(response.getEntity(), "UTF-8");

        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }


}

扩展一:

1、上面工具类一般是用于我方图片传到对方服务器上,需要封装请求头的情况。

下面假设对方系统一般会给你一个图片url,需要上传到我服务器上。

//文件上传(不需要封装请求头的)
/*
 * url:上传到我方需要调用的接口url
 * fileName:文件名
 * inputStream:需要上传的图片资源流
 *
*/
    public static String doPost(String url, String fileName, InputStream inputStream) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String result = "";
        try {
            HttpPost httpPost = new HttpPost(url);
            MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
            // 文件流
            builder.addBinaryBody("files", inputStream, ContentType.MULTIPART_FORM_DATA, fileName);
            HttpEntity entity = builder.build();
            httpPost.setEntity(entity);
            // 执行提交
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity responseEntity = response.getEntity();
            if (responseEntity != null) {
                // 将响应内容转换为字符串
                result = EntityUtils.toString(responseEntity, StandardCharsets.UTF_8);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

2、实际调用仅供参考(对方一般会提供一个图片资源url,将url转成inputStream,再调用1中的接口即可)

//示例:提供一个图片url上传到远端服务器
List<Map<String, Object>> file0InfoList = getApplicationFormFileInfo(0, ytenantId);
for (int i = 0; i < file0InfoList.size(); i++) {
Map<String, Object> file0Map = file0InfoList.get(i);
//中间表id
String id = String.valueOf(file0Map.get("id"));
String applicationFormNo = String.valueOf(file0Map.get("application_form_no"));
String fileType = String.valueOf(file0Map.get("file_type"));
String fileUrl = String.valueOf(file0Map.get("file_url"));
String fileName = String.valueOf(file0Map.get("file_name"));
//需要上传图片资源的单据id
String formId = getReplaceApplicationFormId(fileType, applicationFormNo, ytenantId);

String suffix = null;
if (fileUrl.contains("jpeg")) {
	suffix = ".jpeg";
} else if (fileUrl.contains("jpg")) {
	suffix = ".jpg";
} else if (fileUrl.contains("png")) {
	suffix = ".png";
} else if (fileUrl.contains("JPEG")) {
	suffix = ".jpeg";
} else if (fileUrl.contains("JPG")) {
	suffix = ".jpg";
} else if (fileUrl.contains("PNG")) {
	suffix = ".png";
}
//(fileUrl是对方提供的需要上传的图片url)
URL url = new URL(UriUtils.encodePath(fileUrl, StandardCharsets.UTF_8));
//建立链接 获取流
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-Type", "plain/text;charset=" + StandardCharsets.UTF_8);
conn.setRequestProperty("charset", String.valueOf(StandardCharsets.UTF_8));
conn.setDoInput(true);
conn.setDoOutput(true);
inStream = conn.getInputStream();
//(saveFileUrl是我方服务器url)
String saveFileUrl = appConfig.getDomainUrl() + FILEURL + accessToken + "&businessType=" + BUSINESSTYPE + "&businessId=" + formId;
//(调用1中的doPost()方法)
String doPost = doPost(saveFileUrl, fileName + suffix, inStream);
if (StringUtils.isNotBlank(doPost)) {
	JSONObject result = JSONObject.parseObject(doPost);
	if ("200".equals(result.get("code"))) {
		//上传完图片到BIP获取到返回的图片id
		String fileId = ((Map<String, String>) (((JSONArray) (((JSONObject) result.get("data")).get("data"))).get(0))).get("id");
		//更新version = 1 和 file_id
		if (StringUtils.isNotBlank(fileId)) {
			ApplicationFormFile applicationFormFile = new ApplicationFormFile();
			applicationFormFile.setId(id);
			applicationFormFile.setFileId(fileId);
			applicationFormFile.setVersion(1);
			applicationFormFile.setModifyTime(DateUtil.getNow());
			applicationFormFile.setPubts(DateUtil.getNow());

			int opr = applicationFormFileMapper.updateByPrimaryKeySelective(applicationFormFile);
		}

	} else {
		log.error("附件保存异常: {}。请确认图片url资源可以访问:{}", doPost, fileUrl);
	}

}

扩展二:获取不同接口的返回结果

1、获取接口返回的输入流(仅供参考)

//获取接口返回的输入流
try {
	HttpResponse response = com.yonyou.iuap.utils.HttpUtil.getInstance().doPost(domain + url,null,paramMap,headMap);
	InputStream inputStream = null;
	if (response != null) {
		int status = response.getStatusLine().getStatusCode();
		if (status >= 200 && status < 300) {
			HttpEntity resEntity = response.getEntity();
			if (resEntity != null) {
				inputStream = resEntity.getContent();
			}
		}
		return inputStream;
	}
} catch (Exception e) {
	log.info(ResultMessage.error(e.getMessage()));
}

2、获取接口返回的string类型数据(仅供参考)

//获取接口返回的string类型数据
HttpResponse response = HttpUtil.getInstance().doPost(delFileUrl, null, null);
if (response != null) {
    int status = response.getStatusLine().getStatusCode();
    if (status >= 200 && status < 300) {
        HttpEntity resEntity = response.getEntity();
        if (resEntity != null) {
            String result = EntityUtils.toString(resEntity);
            JSONObject jsonObject = JSONObject.parseObject(result);
            if ("200".equals(jsonObject.get("code"))) {
                //更新version = 0
                ApplicationFormFile applicationFormFile = new ApplicationFormFile();
                applicationFormFile.setId(id);
                applicationFormFile.setVersion(0);
                applicationFormFile.setModifyTime(DateUtil.getNow());
                applicationFormFile.setPubts(DateUtil.getNow());
                applicationFormFileMapper.updateByPrimaryKeySelective(applicationFormFile);
            }
        }

    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

multipart/form-data格式接口调用工具类,实现文件上传 的相关文章

随机推荐

  • 标准二阶响应--佛朗哥

    如果一个电路对任何有界输入在响应中产生一个有界的输出 就说明这个电路是稳定的 判断一个电路是否稳定一种方法是将某些能量注入到它的电抗元件中的一个或者多个 然后在没有任何外加电源的情况下观察这个电路是如何作为的 这种情况下的响应为无源或者自然
  • STM32F103 GPIO输出模式2MHz,10MHz,50MHz波形对比

    在STM32F103中GPIO的输出模式有三种速度配置 如图所示 经过测试发现 这三种速度的输出模式与IO的翻转频率没有关系 它们影响的可能是驱动能力 下面是在IO极限频率 18MHz 下 三种模式的波形
  • bootstrap实现轮播图

    div class carousel slide style width 400px margin 30px auto ol class carousel indicators li class active li li li ol div
  • 数据库类型区分

    数据库类型主要可分为 网状数据库 Network Database 关系数据库 Relational Database 树状数据库 Hierarchical Database 面向对象数据库 Object oriented Database
  • qemu 对 ARMv8的支持

    qemu 可以支持 ARMv8 且支持的 boot 包括 1 从 ATF启动 2 从 UEFI启动 3 从 u boot启动 4 从 linux 启动 这里打算用以下平台 qemu system aarch64 M virt cpu qem
  • buckboost变换器简介

    1 buckboost拓扑 Vo Vin D 1 D 极性相反 可以升压也可以降压
  • latex 大于小于大于等于小于等于

    转载于https www cnblogs com kjkj p 10505832 html 发现大部分人只回答大于等于号 小于等于号的写法 而没有说大于 小于号的分别写法 大于号 textgreater 小于号 textless 下面的后面
  • android 动画开发

    动画的分类 Android通过Animations为android UI提供了一系列的动画效果 可以进行旋转 缩放 淡入淡出等 这些效果可以应用在绝大多数的空间中 Android中的动画一般为两类 1 Frame by frame Anim
  • 笔试题(十二):走梅花桩

    Redraiment是走梅花桩的高手 Redraiment可以选择任意一个起点 从前到后 但只能从低处往高处的桩子走 他希望走的步数最多 你能替Redraiment研究他最多走的步数吗 数据范围 每组数据长度满足 1 n 200 数据大小满
  • 利用Charles打断点修改返回数据

    1 选择你需要修改数据的接口 2 选中后 proxy gt breakPoint Setting 在出来的弹窗中找到你标记的接口 双击 选择对应的方法 get post 然后将Query里面的删掉 写上 确保一下request和respon
  • python学习之基于Python的人脸识别技术学习

    摘要 面部识别技术的应用越来越广泛 它广泛应用于安全系统 人机交互 社交媒体 医疗保健等领域 本文介绍了基于Python的人脸识别技术 包括人脸检测 人脸特征提取和人脸识别三个部分 我们使用OpenCV和Dlib库来实现这些功能 并使用Py
  • Python实现最小顶点覆盖算法

    Python实现最小顶点覆盖算法 最小顶点覆盖问题是图论中的重要问题 其目标是找到至少数量的顶点 使得每一条边至少有一个端点被这些顶点所覆盖 该问题在实际中有诸多应用 例如网络流分析和计算机视觉等领域 本文将介绍如何使用Python实现最小
  • 10.Docker(一)-----安装、初步使用、镜像、Dockerfile常用指令、通过Dockerfile文件封装nginx镜像并优化

    安装 初步使用 镜像 Dockerfile常用指令 通过Dockerfile文件封装nginx镜像并优化 一 简介 二 安装 1 安装配置 仓库配有的安装包 安装 桥接 2 导入马里奥游戏 浏览器访问172 25 15 1 3 删除 4 导
  • 删除链表中重复的元素

    题目描述 给定一个排序链表 删除所有含有重复数字的节点 只保留原始链表中 没有重复出现 的数字 样例 输入 1 gt 2 gt 3 gt 3 gt 4 gt 4 gt 5 输出 1 gt 2 gt 5 分析 从头结点开始遍历该链表 如果当前
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 逆向工具(IDA、pyinstxtractor+uncompyle6、jadx等持续更新)

    IDA Pro IDA Pro Interactive Disassembler Professional 交互式反汇编器专业版 CTF RE PWN必备 打开一个可执行文件前 应先用file命令或者DIE等工具 确定是32位还是64位 然
  • 使用armDebian基本的操作方式

    1 查看进程id pgrep ttnode 2 杀死进程 kill 1308 3 查看硬盘的分区 sudo fdisk l 3 卸载文件卷 umount dev sda1 4 格式化 mkfs vfat dev sda1 5 重启 rebo
  • C++:类和对象(中)---默认成员函数---运算符重载---const的含义

    文章目录 默认成员函数 构造函数 析构函数 拷贝构造函数 运算符重载 赋值运算符重载 const的含义 取地址及const取地址操作符重载 默认成员函数 首先要理解什么是默认成员函数 类在什么都不写的时 编译器会生成六个默认成员函数 用户没
  • 阿里微服务架构Spring Cloud Alibaba Nacos实战

    Spring Cloud Alibaba Nacos 1 常用特性 2 注册中心 配置中心对比 3 生态图 4 安装 5 名词解析 6 代码实战 注册中心 配置中心 nacos官方文档 https nacos io zh cn docs q
  • multipart/form-data格式接口调用工具类,实现文件上传

    1 添加依赖