springcloud feign 实现文件上传

简介: springcloud feign 实现文件上传

文章目录

项目版本

1、jdk:1.8

2、springboot 2.1.6.RELEASE ,springcloud Greenwich.SR6

背景

在早期的 Spring Cloud 中,Feign本身是没有上传文件功能的,要想实现文件上传功能, Feign 早先不支持文件上传,后来虽支持但仍有缺陷,需要一次性完整地读到内存在编码发送。Feign官方提供了子项目feign-form(https://github.com/openFeign/feign-form)。

feign-form

feign-form 扩展依赖于 OpenFeign ,feign-form版本:


  • feign-form 3.5.0 之前的所有 版本都适用于 OpenFeign 9.* 版本;
  • 从 feign-form 3.5.0 版本开始,该模块适用于 OpenFeign 10.1.0 及更高版本。


提示:feign-form没有向后兼容性,也没有任何保证 3.5.0 之后的 feign-form 版本可以与 10.* 之前的 OpenFeign 一起使用。 OpenFeign 在第 10 版中进行了重构,因此最好的方法是 使用最新的 OpenFeign 和 feign-form 版本。

文件上传

使用的项目都是我之前学习的模块:

springcloud 入门(1) eureka注册中心

springcloud 入门 之网关 springcloud gateway

感兴趣的可以看一看。

入门步骤

其实使用起来也很简单:

1、在消费端引入feign-form依赖

这里是在消费端eureka-consumer引入

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

2、在消费端Feign client配置文件中 注入SpringFormEncoder

FeignClientConfig.java

@Configuration
public class FeignClientConfig {
    /**
     * feign 日志打印
     * @return
     */
    @Bean
    public Logger.Level getFeignLoggerLevel() {
        return feign.Logger.Level.FULL;
    }
    @Bean
    @Primary
    @Scope("prototype")
    public Encoder multipartFormEncoder() {
        return new SpringFormEncoder();
    }
}

3、在消费端及生产端使用

生产端:

使用很简单,只需要在对外提供的接口上限制接受的媒体类型

注意:文件接受参数注解用的是@RequestPart

@RequestMapping("/user")
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    @PostMapping(value = "uploadFile" , consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String uploadFile(@RequestPart("file") MultipartFile multipartFile){
        return userService.uploadFile(multipartFile);
    }
}

这里是把文件名打印出来

@Service
public class UserServiceImpl implements UserService {
    @Override
    public String uploadFile(MultipartFile multipartFile) {
        final String originalFilename = multipartFile.getOriginalFilename();
        return originalFilename;
    }
}

消费端:

消费端在调用生产端的接口上也要限制媒体类型,并且使用FeignClientConfig作为配置文件

UserProviderClientService.java

@FeignClient(name = "CLOUD-GATEWAY" , path = "/user-providers/user"  ,fallbackFactory = UserProviderServiceFallbackFactory.class,configuration = FeignClientConfig.class)
public interface UserProviderClientService {
    @PostMapping(value= "uploadFile" , consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String uploadFile(@RequestPart("file") MultipartFile multipartFile);
}

FeignController.java

@RequestMapping("/consumer/feign")
@RestController
public class FeignController {
  @Autowired
    private UserProviderClientService userProviderClientService;
    @PostMapping(value = "uploadFile" , consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String uploadFile(@RequestPart("file") MultipartFile multipartFile){
        return userProviderClientService.uploadFile(multipartFile);
    }
}

4、测试

使用postman测试

image.png

我这里使用的是网关springcloud gateway,但是不影响文件上传结果。

需要了解springcloud gateway的可以看springcloud 入门 之网关 springcloud gateway


至此,feign上传文件功能就完成。


有关feign的学习可以参考springcloud 入门(3) 声明式调用 Feign


学习更多关于springcloud的可以关注我的 springcloud 专栏


GitHub地址:

https://github.com/ArronSun/micro-services-practice.git


参考:


《重新定义springcloud 实战》


能力一般,水平有限,如有错误,请多指出。

如果对你有用点个关注给个赞呗



目录
相关文章
|
30天前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
77 1
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
2月前
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
502 2
|
1月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
37 0
|
2月前
|
Java API 开发者
【已解决】Spring Cloud Feign 上传文件,提示:the request was rejected because no multipart boundary was found的问题
【已解决】Spring Cloud Feign 上传文件,提示:the request was rejected because no multipart boundary was found的问题
402 0
|
3月前
|
Java Spring
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
|
4月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
498 15
|
3月前
|
Java Spring 容器
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
|
3月前
|
存储 Java Spring
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
【Azure Spring Cloud】Azure Spring Cloud服务,如何获取应用程序日志文件呢?
|
3月前
|
SQL Java 数据库连接
【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI
【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI