龙空技术网

Feign接口实现上传多个文件的坑

老顾聊技术 3271

前言:

眼前看官们对“spring 上传多个文件”大体比较关注,你们都想要剖析一些“spring 上传多个文件”的相关文章。那么小编同时在网上搜集了一些有关“spring 上传多个文件””的相关文章,希望小伙伴们能喜欢,咱们快快来了解一下吧!

前言

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

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

流程

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

代码后台文件服务

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

Feign接口

通过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之水平分库和读写分离(二)

标签: #spring 上传多个文件