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

前言

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

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

流程

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

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

代码

后台文件服务

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

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

Feign接口

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

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

接口定义

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

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

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

业务服务

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

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

坑二

在启动执行时,会出现

 the request was rejected because no multipart boundary was found

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

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

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

这个是为什么???

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

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

导致原因

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

如何解决

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

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

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

坑二

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

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

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

我们来看看SpringFormEncoder源码

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

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

如何解决

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

代码如下:

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

然后修改配置类

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

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

总结

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

补充

不过发现

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

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

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

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

您可能还会对下面的文章感兴趣: