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

这篇具有很好参考价值的文章主要介绍了【使用multipart/form-data方式传递MultipartFile参数,实现服务间文件的传递】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 一、代码实现
  • 二、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

文章来源地址https://www.toymoban.com/news/detail-654525.html

到了这里,关于【使用multipart/form-data方式传递MultipartFile参数,实现服务间文件的传递】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用postman发送请求,提示Content type ‘multipart/form-data not supported

    1、原因:后端通过@RequestBody 的方式接收参数,不能通过form-data方式传参,每一个请求必须是通过实体对象进行传参,需要改为使用json传参

    2024年01月22日
    浏览(52)
  • 理解 HTTP 中的 multipart/form-data

    HTTP 是一种基于请求-响应模型的网络通信协议,主要用于 Web 中客户端和服务器之间通信的数据传输。事实上,如今的互联网就是构建在 HTTP 之上的。基于请求-响应模式的通信方式很简单,客户端向服务器发送请求,服务器处理请求并进行响应。 HTTP 其实并不关心我们想要传

    2024年02月08日
    浏览(50)
  • postman上传文件(multipart/form-data请求)

    网页的form表单中,如果存在上传文件的表单,则需要将form标签设置enctype=\\\"multipart/form-data\\\"属性,意思是将Content-Type设置成multipart/form-data。 那么如何使用 postman发送 multipart/form-data请求呢? Content-Type: multipart/form-data; boundary= 表单中的 enctype 属性规定在发送到服务器之前应该如

    2024年02月02日
    浏览(71)
  • 使用postMan调试接口出现 Content type ‘multipart/form-data;charset=UTF-8‘ not supported“

    最近好久没写springboot项目了,然后写了一个添加用户的接口,使用postman测试时出现了问题。如下图: org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘multipart/form-data;boundary=--------------------------121447464228391674964565;charset=UTF-8’ not supported 原因是接口做了规范,默认就是

    2024年02月04日
    浏览(65)
  • python + request实现multipart/form-data请求上传文件

    1、multipart/form-data介绍         multipart/form-data 是 HTTP 协议中用于上传文件的一种类型。它允许客户端向服务器发送文件以及一些额外的元数据(例如文件名、MIME 类型、图片等)。这种类型的请求不同于普通的application/x-www-form-urlencoded 格式,其中数据是在请求体中进行编

    2024年02月11日
    浏览(39)
  • 【已解决】使用Postman调试接口出现 Content type ‘multipart/form-data;charset=UTF-8‘ not supported“

    使用postman请求公司接口出现下面报错 message:“Content type ‘multipart/form-data;boundary=--------------------------134853779743698278510986;charset=UTF-8’ not supported” 原因是我们的接口做了规范,默认就是通过@RequestBody 的方式请求的;也就是每一个请求必须是通过实体对象进行传参,不能通过

    2024年02月10日
    浏览(52)
  • Content type ‘multipart/form-data;boundary=解决方案

    记录一个小问题 今天在用postman调试接口,发送请求的时候没进入断点就报错\\\" Content type \\\'multipart/form-data;boundary=--------------------------xxxxxxxxxxxxx;\\\" 当时我就纳了闷了,东研究西研究的找了半天原因。 最后找了一个老师傅,一眼就看出来问题了。因为接口是别人写的,我属于后面

    2024年02月15日
    浏览(53)
  • 上传文件.HttpMediaTypeNotSupportedException:Content type ‘multipart/form-data;

    org.springframework.web.HttpMediaTypeNotSupportedException:Content type \\\'multipart/form-data;boundary=----WebKitFormBoundaryCkkfE9h3eXMf4Pw4;charset=UTF-8\\\' not supported controller方法入参问题所致 原本接口定义为 第二个参数有注解 @RequestBody,它是导致这个问题的关键!!! 解决:将@RequestBody去掉即可解决问题!再

    2024年02月14日
    浏览(58)
  • SpringBoot:使用application/octet-stream 流式上传大文件,解决Mutipartfile multipart/form-data上传产生临时文件问题

    multipart的流不是HTTPRequest的流,而是服务器的临时文件流 multipart/form-data是表单上传,接口可以从Mutipartfile对象获取输入流getInputStream,表面上看没产生临时文件 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest的getInputStream 这里面的流是从DiskFileItem(一眼磁盘)拿的

    2024年02月14日
    浏览(39)
  • 解锁新技能《springboot基于表单multipart/form-data的文件上传》

    springboot的文件上传有多种实现方案,个人比较推荐方案三通过实体类属性绑定的方式,这样可以方便文件及其关联的相关属性字段; 开源依赖pom 一、单个文件上传及其它属性字段 二、通过数组方式上传多个文件 三、通过实体类绑定方式上传文件及传递其它属性值 四、通过

    2024年02月13日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包