Feign接口实现上传多个文件的坑[通俗易懂]

(28) 2023-05-25 18:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Feign接口实现上传多个文件的坑[通俗易懂],希望能够帮助你!!!。

前言

这段时间老顾需要做一个公共的上传文件资源的服务,可以通过前端直接调用上传文件;还有需求可以通过后台服务通过Feign接口方式 ,调用上传文件资源服务

在这过程中,遇到了一些问题,老顾在这里留个tag,避免小伙伴们也遇到相似的问题

流程

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第1张

上面流程是常规的上传文件的2种方式,我们下面先来看看,正常的代码

代码

后台文件服务

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第2张

文件服务支持单个文件,以及多个文件上传

Feign接口

通过feign接口进行上传文件,需要依赖

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第3张

接口定义

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第4张

上面代码中需定义一个 FileUploadMultipartSupportConfig,如下

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第5张

业务服务

调用Feign接口,实现上传文件

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第6张

坑二

在启动执行时,会出现

 the request was rejected because no multipart boundary was found

分析源码,发现问题出现在

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第7张

可以看到是request中boundary的为空,但是我在接受前台的时候有,跨服务的时候丢了。

这个是为什么???

经过排查,发现我们做了Feign的头部参数的FeginInterceptor

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第8张

导致原因

当用户提交到微服务API时,分隔符boundary是用户那边生成;在API通过fegin调用其他文件上传微服务时候,也会生成一个新boundary分隔符两个导致boundary分隔符不同导致微服务那边接受到MultipartFile是null

如何解决

只需要在转换请求头转发时候过滤掉"Content-Type"即可。如下

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第9张

这样处理的目的就是,Content-Type不传递

坑二

上传多个文件报错,这是为什么呢?主要因为如下代码

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第10张

SpringFormEncoder类里却没有对文件数组类型的判断,以致不能支持文件数组的上传

我们来看看SpringFormEncoder源码

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第11张

在encode方法里又只判断了MultipartFile类型,没有判断数组类型,底层有对数组的支持但上层却缺少了相应判断

如何解决

仿照SpringFormEncoder源码,只修改encode方法;扩展FormEncoder支持多文件上传

代码如下:

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第12张

然后修改配置类

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第13张

这样就可以支持 多个文件了

总结

上面两个坑都填了,小伙伴就可以放心用了。

补充

不过老顾发现

<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form-spring</artifactId>
    <version>3.8.0</version>
</dependency>

在3.8.0版本中,已经修复了 坑二的问题

Feign接口实现上传多个文件的坑[通俗易懂]_https://bianchenghao6.com/blog__第14张

这样小伙伴就不需要重写了FormEncoder


推荐阅读

解决Api统一格式返回,遗留地返回String一个问题

SpringMVC全局异常方案、源码分析,以及常见的入坑

Spring多种启动初始化方案,看这篇就够了

来说说ThreadLocal内存溢出问题

阿里面试题:强、软、弱、虚引用的特点及应用场景

企业常用的并发编程Queue的源码分析

了解JAVA中的SPI机制,以及数据库驱动插件,这一篇就够了

企业实战之阿里druid统一监控方案,你了解吗?

千人千面精准推荐之大白话讲解协同算法(一),看这篇就够了

企业实战之分布式锁方案一步步的演变

你了解滑动时间窗口吗?Sentinel核心源码剖析

Sentinel全局Feign默认熔断降级策略的思考

你所不知道的头部参数传递的坑,来吧!抓紧出坑

5分钟让你理解K8S必备架构概念,以及网络模型(一)

5分钟让你理解K8S必备架构概念,以及网络模型(二)

5分钟让你理解K8S必备架构概念,以及网络模型(三)

大厂如何基于binlog解决多机房同步mysql数据(一)?

大厂如何基于binlog解决多机房同步mysql数据(二)?

基于binlog的canal组件有哪些使用场景(三)?

基于binlog日志之canal企业应用及高可用原理(四)?

可用于大型应用的微服务生态灰度发布如何实现?

一线大厂级别公共Redis集群监控,细化到每个项目实例

Sharding-jdbc的实战入门之水平分表(一)

Sharding-Jdbc之水平分库和读写分离(二)

上一篇

已是最后文章

下一篇

已是最新文章

发表回复