本文由 简悦 SimpRead 转码, 原文地址 www.toutiao.com
还有需求可以通过后台服务通过 Feign 接口方式 ,调用上传文件资源服务。在这过程中,遇到了一些问题,老顾在这里留个 tag,避免小伙伴们也遇到相似
这段时间老顾需要做一个公共的上传文件资源的服务,可以通过前端直接调用上传文件;还有需求可以通过后台服务通过 Feign 接口方式 ,调用上传文件资源服务。
在这过程中,遇到了一些问题,老顾在这里留个 tag,避免小伙伴们也遇到相似的问题
上面流程是常规的上传文件的 2 种方式,我们下面先来看看,正常的代码
文件服务支持单个文件,以及多个文件上传
通过 feign 接口进行上传文件,需要依赖
接口定义
上面代码中需定义一个 FileUploadMultipartSupportConfig,如下
调用 Feign 接口,实现上传文件
在启动执行时,会出现
|
|
分析源码,发现问题出现在
可以看到是 request 中 boundary 的为空,但是我在接受前台的时候有,跨服务的时候丢了。
这个是为什么???
经过排查,发现我们做了 Feign 的头部参数的 FeginInterceptor
当用户提交到微服务 API 时, 分隔符 boundary 是用户那边生成;在 API 通过 fegin 调用其他文件上传微服务时候,也会生成一个新 boundary 分隔符,两个导致 boundary 分隔符不同导致微服务那边接受到 MultipartFile 是 null。
只需要在转换请求头转发时候过滤掉 “Content-Type” 即可。如下
这样处理的目的就是,Content-Type 不传递
上传多个文件报错,这是为什么呢?主要因为如下代码
SpringFormEncoder 类里却没有对文件数组类型的判断,以致不能支持文件数组的上传
我们来看看 SpringFormEncoder 源码
在 encode 方法里又只判断了 MultipartFile 类型,没有判断数组类型,底层有对数组的支持但上层却缺少了相应判断
仿照 SpringFormEncoder 源码,只修改 encode 方法;扩展 FormEncoder 支持多文件上传
代码如下:
然后修改配置类
这样就可以支持 多个文件了
上面两个坑都填了,小伙伴就可以放心用了。
不过老顾发现
|
|
在 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 之水平分库和读写分离(二)