文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-06 22:40

关注

目录

一、代码实现

1、A服务接收前端上传文件并发送至B服务
引入依赖
            org.apache.httpcomponents            httpclient            4.5.13                            org.apache.httpcomponents            httpmime            4.5.13        
使用MultipartFile接收前端文件
  @PostMapping("/import")    @ApiOperation("文件上传")    public Object importExcel(@RequestParam("file") MultipartFile file) {        // 后续文件处理逻辑......    }
调取第三方接口,发送 MultipartFile 文件
    public static Object doPostFormData(String url, String fileParamName, MultipartFile multipartFile, Map 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 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 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 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两个包,下载地址为:https://file.lsjlt.com/upload/f/202309/06/sisn33zafcp.jpg”);否则会导致接收文件时getFileNames()为空。
  • 4.不使用addBinaryBody,也可以直接使用addPart,先把文件转换成FileBody就可以了
  • contentType使用【multipart/form-data】:它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件,
  • boundary:请求体中的boundary参数指定的就是分隔体,请求参数之间需要通过分隔体分隔,不然就会被识别成一个参数。

四、参考链接

  • https://blog.csdn.net/lexuansweet/article/details/122967948

来源地址:https://blog.csdn.net/weixin_43202160/article/details/129025774

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧