原文链接:[使用Feign接口实现文件上传的解决方案](https://blog.kdyzm.cn/post/176)
一般的情况下,后端有个微服务,暴露出一个文件上传的restful接口给前端,前端调用该接口获取上传后的链接以及oss key值完成上传。假设提供restful接口的这个服务叫做A,现在有个微服务B有个本地文件,需要将本地文件调用A文件文件上传接口上传到文件服务器,该如何做?
一般情况下,一个文件上传的restful接口如下所示:
``` java
@PostMapping("/upload")
public WrapperResult<UploadResult> uploadFile(@RequestParam("file") MultipartFile multipartFile){
......
}
```
那对应的Feign接口就如下所示
``` java
@PostMapping("/upload")
public WrapperResult<UploadResult> uploadFile(@RequestParam("file") MultipartFile multipartFile);
```
从直觉上来看,直接调用八成会出问题(笑),通过踩坑,我梳理了下后端调用Feign接口实现文件上传的改造点
### 1. 接口修改
一般的文件上传接口定义:
``` java
@PostMapping("/upload")
public WrapperResult<UploadResult> uploadFile(@RequestParam("file") MultipartFile multipartFile){
......
}
```
在Feign接口暴露出来的情况下,则不能再使用@RequestParam注解,应当使用@RequestPart注解,另外需要指定consumes类型为表单类型,否则会翻车。
修改后的接口如下
``` java
@PostMapping(
value = {"/upload"},
consumes = {"multipart/form-data"}
)
UploadResult uploadFile(@RequestPart("file") @NotNull MultipartFile multipartFile);
```
这里注意两点:
1. 使用@RequestPart注解替换掉@RequestParam注解
2. 指定consumes类型为表单类型
### 2. Encoder修改
在springboot中,一般的Encoder定义如下
``` java
@Bean
@Primary
public Encoder feignEncoder() {
HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(
JsonUtils.getObjectMapper()
);
ObjectFactory<HttpMessageConverters> objectFactory =
() -> new HttpMessageConverters(jacksonConverter);
return new SpringEncoder(objectFactory);
}
```
返回了一个SpringEncoder对象,这里需要返回一个SpringFormEncoder对象以支持Feign接口的表单功能,只需要将new SpringEncoder(objectFactory)修改为new SpringFormEncoder(new SpringEncoder(objectFactory))即可,修改后的代码如下
``` java
@Bean
@Primary
public Encoder feignEncoder() {
HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(
JsonUtils.getObjectMapper()
);
ObjectFactory<HttpMessageConverters> objectFactory =
() -> new HttpMessageConverters(jacksonConverter);
return new SpringFormEncoder(new SpringEncoder(objectFactory));
}
```
### 3. 客户端调用修改
现在Feign接口长这个样子
``` java
@PostMapping(
value = {"/upload"},
consumes = {"multipart/form-data"}
)
UploadResult uploadFile(@RequestPart("file") @NotNull MultipartFile multipartFile);
```
那我们Feign接口调用的时候就得构造MultipartFile对象,这里需要引入spring-test的依赖
``` xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
```
然后代码这么写
``` java
FileInputStream fis = null;
try {
Tika tika = new Tika();
String mimeType = tika.detect(file);
fis = new FileInputStream(file);
MockMultipartFile mockMultipartFile = new MockMultipartFile(
"file",
file.getName(),
mimeType,
fis
);
UploadResult uploadResult = ossPublicApi.uploadFile(mockMultipartFile);
}catch(Exception e){
......
}
```
这里为了告知正确的媒体类型,引入了tika,关于tika,参考文章 [使用tika获取文件的实际类型](https://blog.kdyzm.cn/post/174) 引入
需要注意以下几点
1. 需要引入spring-test,注意scope默认就行,不能为provided
2. 需要引入tika,告知正确的媒体类型,否则上传到minio等文件服务器,在浏览器中打开图片、mp4视频等文件本来应当在浏览器打开的文件会变成自动下载
END.
分享到:
相关推荐
Feign调用丢失Header的解决方案.docx
调用feign上传大文件 1G报oom异常,通过将大文件分片,转成字节byte到合并端随机读写,合成大文件zip
主要为大家详细介绍了使用Feign实现微服务间文件下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
通过Feign 扩展 可以实现Feign 单个文件和多个文件的上传,示例代码中演示了单个文件上传,多个文件上参考博客自己实现即可。文章地址:https://blog.csdn.net/AaronSimon/article/details/82710938
主要介绍了spring cloud feign实现远程调用服务传输文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
feign调用session丢失解决方案, Hystrix传播ThreadLocal对象; 自定义熔断策略
SpringBoot使用Feign调用第三方接口实例代码
主要介绍了Spring Cloud Feign接口返回流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要为大家详细介绍了SpringCloud使用Feign文件上传、下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了使用Feign实现微服务间文件传输,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了使用Feign扩展包实现微服务间文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要介绍了SpringBoot如何使用feign实现远程接口调用和错误熔断,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Feign是一个声明式的Web Service客户端,它能够让Web Service客户端的编写变得更加容易(你只需创建一个接口,并在接口上添加相应注解即可)。除了Feign自带的注解外它还支持JAX-RS注解,SpringCloud又为Feign增加了...
springcloud feign 服务消费者 类似 webservice ====== http://knight-black-bob.iteye.com/blog/2356222
本文将介绍如何在Spring Cloud中使用Feign和Eureka实现服务调用和发现的过程。 首先,让我们了解一下Feign和Eureka的基本概念。Feign是一个声明式的HTTP客户端,可以帮助我们更轻松地编写和调用RESTful服务。它基于...
主要介绍了详解feign调用session丢失解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本案例是Spring Cloud案例,使用Spring Boot作为微服务项目,项目主要是练习使用Feign组件
feign+springboot的使用
Spring Cloud中使用Feign,将feign框架整合到Spring Cloud之中,实现负载均衡等低耦合客户端
主要介绍了Spring Cloud如何使用Feign构造多参数的请求,以GET以及POST方法的请求为例进行讲解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下