【使用multipart/form-data方式传递MultipartFile参数,实现服务间文件的传递】

2023-05-16

目录

  • 一、代码实现
  • 二、MultipartFile工具类
  • 三、HttpClient使用
  • 四、参考链接

一、代码实现

1、A服务接收前端上传文件并发送至B服务
引入依赖
<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.13</version>
        </dependency>
使用MultipartFile接收前端文件
  	@PostMapping("/import")
    @ApiOperation("文件上传")
    public Object importExcel(@RequestParam("file") MultipartFile file) {
        // 后续文件处理逻辑......
    }
调取第三方接口,发送 MultipartFile 文件
/**
     * 以post方式调用第三方接口,以form-data 形式  发送 MultipartFile 文件数据
     *
     * @param url           post请求url
     * @param fileParamName 文件参数名称
     * @param multipartFile 文件
     * @param paramMap      表单里其他参数
     * @return 响应结果
     */
    public static Object doPostFormData(String url, String fileParamName, MultipartFile multipartFile, Map<String, String> paramMap) {
        // 创建Http实例
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 创建HttpPost实例
        HttpPost httpPost = new HttpPost(url);
        // 请求参数配置
        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000)
                .setConnectionRequestTimeout(10000).build();
        httpPost.setConfig(requestConfig);
        try {
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.setCharset(StandardCharsets.UTF_8);
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

            String fileName = multipartFile.getOriginalFilename();
            // 文件流
            builder.addBinaryBody(fileParamName, multipartFile.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);
            //表单中其他参数
            for (Map.Entry<String, String> entry : paramMap.entrySet()) {
                builder.addPart(entry.getKey(), new StringBody(entry.getValue(), ContentType.create("text/plain", Consts.UTF_8)));
            }
            HttpEntity entity = builder.build();
            httpPost.setEntity(entity);
            // 执行提交
            HttpResponse response = httpClient.execute(httpPost);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                // 返回
                return EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("调用HttpPost失败!" + e.toString());
        } finally {
            if (httpClient != null) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    log.error("关闭HttpPost连接失败!");
                }
            }
        }
        return null;
    }
2、B服务接收文件
    @PostMapping(value = "/import", headers = "content-type=multipart/form-data")
    @ApiOperation("接收上传文件")
    public Result<Object> importExcel(HttpServletRequest request, HttpServletResponse response) {
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
        commonsMultipartResolver.setDefaultEncoding("utf-8");
        if (commonsMultipartResolver.isMultipart(request)){
            MultipartHttpServletRequest mulReq = (MultipartHttpServletRequest) request;
            Map<String, MultipartFile> map = mulReq.getFileMap();
          	// fileParamName
            MultipartFile multiFile = map.get("fileParamName");
            // 后续文件处理逻辑......
        }
        return new Result<>().error("请求内容有误!");
    }

二、MultipartFile工具类

  • 简介:MultipartFile是SpringMVC提供简化上传操作的工具类,在不使用框架之前,都是使用原生的HttpServletRequest来接收上传的数据,文件是以二进制流传递到后端的,然后需要我们自己转换为File类。使用了MultipartFile工具类之后,我们对文件上传的操作就简便许多了。
  • MultipartFile工具类的接口方法
package org.springframework.web.multipart;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import org.springframework.core.io.InputStreamSource;
import org.springframework.core.io.Resource;
import org.springframework.lang.Nullable;
import org.springframework.util.FileCopyUtils;

public interface MultipartFile extends InputStreamSource {
    //getName() 返回参数的名称
    String getName();
    //获取源文件的昵称
    @Nullable
    String getOriginalFilename();
    //getContentType() 返回文件的内容类型
    @Nullable
    String getContentType();
    //isEmpty() 判断是否为空,或者上传的文件是否有内容
    boolean isEmpty();
    //getSize() 返回文件大小 以字节为单位
    long getSize();
    //getBytes() 将文件内容转化成一个byte[] 返回
    byte[] getBytes() throws IOException;
    //getInputStream() 返回InputStream读取文件的内容
    InputStream getInputStream() throws IOException;

    default Resource getResource() {
        return new MultipartFileResource(this);
    }
    //transferTo是复制file文件到指定位置(比如D盘下的某个位置),不然程序执行完,文件就会消失,程序运行时,临时存储在temp这个文件夹中
    void transferTo(File var1) throws IOException, IllegalStateException;

    default void transferTo(Path dest) throws IOException, IllegalStateException {
        FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));
    }
}
  • InputStreamSource 这个接口本质上返回的还是一个InputStream 流对象
package org.springframework.core.io;

import java.io.IOException;
import java.io.InputStream;

public interface InputStreamSource {
	//定位并打开资源,返回资源对应的输入流。
    //每次调用都会返回新的输入流,调用者在使用完毕后必须关闭该资源。 
    InputStream getInputStream() throws IOException;
}

三、HttpClient使用

  • 使用httpclient,需要下载httpclient-4.5.jar、httpmime-4.5.jar两个包,下载地址为:http://hc.apache.org/downloads.cgi 大致看了下源码,其实也是使用字符拼接,只是封装后使用起来更简洁方便一些。、
  • httpclient需要注意的4点:
  • 1.HttpClient4.3版本往后,原来的MultipartEntity过时不建议再使用了,替换成新的httpmime下面的MultipartEntityBuilder
  • 2.multipartEntity 最好设置contentType和boundary,不然会导致后面接收文件时的第一种方法接收不到文件报错。
  • 3.使用addBinaryBody的坑:addBinaryBody 有6种不同用法,一般都是如下代码所示上传File即可,但是当传byte[]字节数组时,必须使用4参传值,且第四参必须带后缀名,例如:entityBuilder.addBinaryBody(“file”,new byte[]{},ContentType.DEFAULT_BINARY,“fileName.jpg”);否则会导致接收文件时getFileNames()为空。
  • 4.不使用addBinaryBody,也可以直接使用addPart,先把文件转换成FileBody就可以了
  • contentType使用【multipart/form-data】:它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件,
  • boundary:请求体中的boundary参数指定的就是分隔体,请求参数之间需要通过分隔体分隔,不然就会被识别成一个参数。

四、参考链接

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

【使用multipart/form-data方式传递MultipartFile参数,实现服务间文件的传递】 的相关文章

  • gitlab自定义头像设置

    这里写自定义目录标题 选一个自己喜欢的头像放在自建nginx服务中 可放在gitlab的nginx中 xff1a 设置gitlab修改配置 etc gitlab gitlab rb 重新加载gitlab配置最终效果 选一个自己喜欢的头像放在
  • 【无标题】

    https www cnblogs com liujuncm5 p 6713784 html 一 依赖安装 yum install y gcc c 43 43 pcre pcre devel zlib zlib devel openssl
  • shell:批量下载epel源rpms

    span class token keyword for span span class token for or select variable i span span class token keyword in span span c
  • linux静动态依赖

    安装glibc static usr bin ld cannot find lpthread usr bin ld cannot find lc
  • 修改ftp根目录

    修改 etc vsftpd vsftpd conf xff0c 加入如下三行 xff1a local root 61 chroot local user 61 YES anon root 61 local root表示使用本地用户登录到ft
  • 基于深度学习的医学图像配准综述

    原文转自 xff1a https blog csdn net weixin 41699811 article details 84314070 版权声明 xff1a 本文为CSDN博主 Timmymm 的原创文章 xff0c 遵循 CC 4
  • C语言实现生产者消费者模型(线程、信号量、互斥锁)

    三个概念 xff1a 生产者消费者模型 线程 信号量 1 生产者消费者模型 利用生活中的例子 xff0c 生产者生产商品 xff0c 商品放在超市 xff0c 消费者去超市购买 使用 商品 xff0c 也就是生产者消费者模型 生产者生成一定
  • Linux Deepin [解决] - 您也许需要运行“apt --fix-broken install”来修正上面的错误。

    问题来源 Os Linux Deepin 20 社区 在星火商店下载了网易云音乐的包 xff0c 用深度安装器安装 xff0c 能用能调节窗口大小 xff0c 但是字体大小不能调剂 emmm高分屏用户哭了后悔自己买那么高的玩意 于是右键卸载
  • C++判断素数(求素数)

    一个大于1的自然数 xff0c 且除了1和它本身外 xff0c 不能被其他自然数整除的数叫素数 换句话说就是 xff0c 除了1和该数本身以外不再有其他的因数的数被称为素数 判断m是否是素数的算法是 xff1a m在区间 1 xff0c s
  • Arch Linux wine 微信、heidissql、chrome - AUR heplers - yay

    Intro span class token function uname span a Linux arch 5 10 16 arch1 1 span class token comment 1 SMP PREEMPT Sat 13 Fe
  • C语言-基础例题55道

    1 简单程序设计 编程写程序 xff0c 在屏幕上输出信息 xff1a Happy New Year 输出图形 include lt stdio h gt void main printf 34 Happy New Year n 34 2
  • Python 端口扫描器

    目录 前言一 TCP全连接二 程序编写1 获得主机名和端口2 解析主机名和端口3 抓取应用的Banner4 线程扫描5 信号量机制 总结 前言 任何一个靠谱的网络攻击都是起步于侦查的 在这里 xff0c 我们将使用Python来编写一个扫描
  • linux 实现开机自动登陆

    1 Linux实现开机自动登陆 可以指定登陆的账户 在登陆Linux系统的时候 xff0c 在登陆界面往往需要输入密码后进行登陆 xff0c 如果想实现Linux锡系统开机后自动登陆某个账户 xff0c 可以进行如下的设置 xff1a 可以
  • python中@statimethod和@clasmetod的简单理解

    1 64 statimethod xff1a 加上这一句话 xff0c 不需要实例化即可调用类方法 举例如下 xff1a 但我发现 xff0c 只要定义方法时加了self 再用静态方法会一直报错 实例化和非实例化都会报错 2 64 clas
  • 长文慎入,如何快速开发区块链游戏

    长文慎入 xff0c 如何快速开发区块链游戏 译者注 xff1a 原文 xff1a 初始发行Enjin整合初始整合客户端SDK GUI客户端SDK APIEnjin的API是GraphQL Enjin推荐使用服务器排列你的物品并分批发送存储
  • Nginx配置文件(nginx.conf)配置详解

    Nginx配置文件nginx conf中文详解 定义Nginx运行的用户和用户组user www www nginx进程数 xff0c 建议设置为等于CPU总核心数 worker processes 8 全局错误日志定义类型 xff0c d
  • 【有机】提纲整理1——化学基础

    周环反应 元素 xff08 磷硫硅 xff09 金属有机 生物有机 天然产物 含氮化合物 含氧化合物 醇 酚 醚 醛 酮 醌 羧酸及其衍生物 卤代烷 碳氢化合物 烷烃 烯烃 炔烃 苯 历史 结构 命名 波谱 立体化学 1 原子结构与化学键的
  • 求二叉树的高度

    二叉树高度是二叉树的重要知识点 xff0c 在日常练习中我们会经常碰见这种类型的题目 求解二叉树的高度可以用递归方式 递归求解二叉树高度 int GetHeight BinTree BT int h1 int h2 if BT return
  • Linux开启ssh远程登录

    Linux配置ssh 开启远程登录 你好 xff01 这里介绍了Linux系统Centos Ubuntu环境下开启ssh的方法 一 CentOS开启SSH服务 安装openssh server xff1b yum list installe
  • Python 中if...else语法和作用、执行流程

    一 if else语法 作用 xff1a 条件成立执行if下方的代码 xff0c 条件不成立执行else下方的代码 案例说明 xff1a 比如拿成年网吧上网的例子 xff0c 如果成年 xff0c 就允许上网 xff0c 如果不成年 xff

随机推荐

  • Ubuntu20.04安装ssh并开启远程访问登录

    1 安装openssh server 打开终端安装openssh server软件包 xff1a span class token function sudo span span class token function apt span
  • pixhawk在启动jmavsim时,启动不了

    lcg 64 ubuntu src Firmware sudo make px4 sitl jmavsim 1 1 cd home lcg src Firmware build cg src Firmware build px4 sitl
  • 数据转换成tfrecord类型并完成读取

    前提 xff1a tensorflow 1 13 1 numpy 1 16 2 python 3 6 5 本例转换 泰坦尼克号数据集 链接 密码 xff1a n8wz 数据预览 xff1a 字段说明 xff1a PassengerId xf
  • Notepad++如何配置NppFTP连接FTP服务器远程编辑

    Notepad 43 43 是很强大的文本编辑工具 xff0c 通过NppFTP插件可以远程连接FTP服务器 xff0c 实现文件的在线编辑 不需要FTP下载文件后再进行编辑 xff0c 配置好与FTP服务器的连接后 xff0c 使用起来会
  • Ubuntu install Chrome

    wget https dl google com linux direct google chrome stable current amd64 deb sudo dpkg i google chrome stable current am
  • 简易输出六十天干地支

    每行十个输出六十天干地支 public static void main String args int i 61 0 count 61 0 step 61 0 String top 61 34 甲 34 34 乙 34 34 丙 34 3
  • 小记:Xshell 简单STP上传下载文件

    小记 xff1a Xshell 简单STP上传下载文件 目录 xff1a 1 Xshell连接远程系统 2 STP连接 3 put get上传下载文件 工具说明 xff1a 本地Windows 10系统 远程Linux系统 xff1a Ce
  • info函数与describe函数

    info 函数与describe 函数 一 xff0c info 函数 功能 xff1a 给出样本数据的相关信息概览 xff1a 行数 xff0c 列数 xff0c 列索引 xff0c 列非空值个数 xff0c 列类型 xff0c 内存占用
  • 快速排序(java代码)

    文章目录 一 快排核心思想二 实例三 代码实现 xff08 java xff09 一 快排核心思想 快排核心思想就是 xff1a 首先在待排序数组中随便选择一个数作为节点 xff08 pivot xff09 xff0c 然后从最后面 xff
  • C# List集合查找删除指定数据

    C List集合查找删除指定数据 文章目录1 实体类2 操作第一个负荷条件数据3 操作所有符合条件数据4 优质源码 文章目录 1 实体类 public class FaultLevelModel public string LBWJ get
  • java.lang.IllegalArgumentException: Unable to instantiate factory class

    前提 xff1a 这两天在搭springboot后台框架的时候 xff08 用的JDK1 8和eclipse xff09 xff0c 折腾了半天 xff0c 在搞泛型的时候会有一些报错 xff0c 原来IDEA上的代码 xff0c 在ecl
  • 发声单元的原理/扬声器的工作原理

    目前市面上常见的耳塞以及耳机的发声单元主要有三种 xff0c 分别是动圈单元 动铁单元和静电单元 静电单元由于工艺比较复杂 成本高 xff0c 单元本身比较脆弱 xff0c 所以市面上并不多见 所以下面着重介绍动圈单元和动铁单元的发声原理
  • 猿创征文|Hexo+Github搭建完全免费个人博客详细教程

    前言 完全免费的搭建个人博客 xff0c 没有任何收费 xff0c 零基础也能上手 xff0c 不需要编程基础 xff0c 跟着操作来即可 首先 xff1a 要了解一下我们搭建博客要用到的框架 xff1a Hexo是高效的静态站点生成框架
  • 3维向量的点乘叉乘运算

    目录 三维向量的点乘三维向量的叉乘点到直线的距离点到平面的距离 三维向量的点乘 点乘得到的是对应元素乘积的和 xff0c 是一个标量 xff0c 没有方向 V1 x1 y1 z1 V2 x2 y2 z2 61 x1x2 43 y1y2 43
  • Windows Server 2016修改Administrator的密码

    1 xff09 在仪表盘上 xff0c 点击 工具 菜单 xff0c 选择 计算机管理 子菜单 2 xff09 本地用户和组 gt 用户 选中Administrator xff0c 点击右键 xff0c 弹出的菜单中选择 设置密码 的子菜单
  • Ubuntu安装Tomcat 执行[./startup.sh]命令显示“ Permission denied “问题解决

    报错贴图 xff1a 根据错误提示 xff0c 为权限问题 然后我们检查权限情况 xff1a 方框中为管理员权限 xff0c 显示为rw r代表read xff08 读 xff09 xff0c w代表write xff08 写 xff09
  • 2021年7月1日:AndroidStudio集成opencv指南。

    版本声明 xff1a 1 AndroidStudio 4 2 1 2 opencv版本4 5 2 3 androidStudio创建项目选择项目类型Native C 43 43 4 下载opencv android版本解压后 xff0c 找
  • Redis(十) 布隆过滤器

    速记 为什么使用布隆过滤器 xff1f 1 为了省内存 xff0c 提高速率 2 因为1所以布隆过滤器不需要百分百正确 3 说存在不一定存在 xff0c 说不存在一定不存在 4 在解决缓存穿透的问题时 xff0c 拦截了大部分的请求 xff
  • Docker学习笔记(九)---DockerFile

    DockerFile 文章目录 DockerFileDockerFile介绍DockerFile构建过程基础知识 DockerFile的指令实战测试CMD 和 ENTRYPOINT 区别 Docker其他学习笔记 DockerFile介绍
  • 【使用multipart/form-data方式传递MultipartFile参数,实现服务间文件的传递】

    目录 一 代码实现二 MultipartFile工具类三 HttpClient使用四 参考链接 一 代码实现 1 A服务接收前端上传文件并发送至B服务 引入依赖 lt dependency gt lt groupId gt org apac