项目版本

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测试
在这里插入图片描述
我这里使用的是网关springcloud gateway,但是不影响文件上传结果。
需要了解springcloud gateway的可以看springcloud 入门 之网关 springcloud gateway

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

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

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

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

参考:

《重新定义springcloud 实战》

能力一般,水平有限,如有错误,请多指出。
如果对你有用点个关注给个赞呗

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐