Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Feign接口实现上传多个文件的坑[通俗易懂],希望能够帮助你!!!。
这段时间老顾需要做一个公共的上传文件资源的服务,可以通过前端直接调用上传文件;还有需求可以通过后台服务通过Feign接口方式 ,调用上传文件资源服务。
在这过程中,遇到了一些问题,老顾在这里留个tag,避免小伙伴们也遇到相似的问题
上面流程是常规的上传文件的2种方式,我们下面先来看看,正常的代码
文件服务支持单个文件,以及多个文件上传
通过feign接口进行上传文件,需要依赖
接口定义
上面代码中需定义一个 FileUploadMultipartSupportConfig,如下
调用Feign接口,实现上传文件
在启动执行时,会出现
the request was rejected because no multipart boundary was found
分析源码,发现问题出现在
可以看到是request中boundary的为空,但是我在接受前台的时候有,跨服务的时候丢了。
这个是为什么???
经过排查,发现我们做了Feign的头部参数的FeginInterceptor
当用户提交到微服务API时,分隔符boundary是用户那边生成;在API通过fegin调用其他文件上传微服务时候,也会生成一个新boundary分隔符,两个导致boundary分隔符不同导致微服务那边接受到MultipartFile是null。
只需要在转换请求头转发时候过滤掉"Content-Type"即可。如下
这样处理的目的就是,Content-Type不传递
上传多个文件报错,这是为什么呢?主要因为如下代码
SpringFormEncoder类里却没有对文件数组类型的判断,以致不能支持文件数组的上传
我们来看看SpringFormEncoder源码
在encode方法里又只判断了MultipartFile类型,没有判断数组类型,底层有对数组的支持但上层却缺少了相应判断
仿照SpringFormEncoder源码,只修改encode方法;扩展FormEncoder支持多文件上传
代码如下:
然后修改配置类
这样就可以支持 多个文件了
上面两个坑都填了,小伙伴就可以放心用了。
不过老顾发现
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.8.0</version>
</dependency>
在3.8.0版本中,已经修复了 坑二的问题
这样小伙伴就不需要重写了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之水平分库和读写分离(二)
上一篇
已是最后文章
下一篇
已是最新文章