前提:目前有俩个服务,一个服务为服务提供者,本例中为文件服务,另一个为服务消费者,本例中为上传文件的服务。 在微服务中,可能有这样的场景,一个服务中产生一个文件(例:Excel)需要持久化保存到文件服务器中,那么文件服务器拿到文件就可以,以不同的方式持久化文件,这样的话无需在其他服务中即消费者写关于持久化文件的内容,只需要简单的通用Http这样的简单协议即可。
网络中一直说官方Feign本身并不支持传文件,所以其他文章都是通过添加io.github.openfeign.form
包来实现。
但是在实践中可以有俩种方式,一个就是上面说的通过修改form表单来实现,另外一个就简单一些,可以直接传输二进制byte[]
本文环境:
版本 | |
---|---|
SpringBoot | 2.0.6.RELEASE |
Cloud | Finchley.SR2 |
第一种方式 修改form表单
服务提供者(文件服务)
这个只是添加一个Controller,功能为收到文件返回该文件的文件名
@RestController
public class UploadController {
@PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String fileUpload(@RequestPart(value = "file") MultipartFile file) {
return file.getName();
}
}
消费者方
添加包依赖
服务提供者不需要这个包依赖,实测添加也没事。
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
添加FeignClient方法
// 这里的value 为 上面的服务提供者的 `spring.application.name` 在Eureka注册的名称,也可以用ip+端口的形式
// 这里 configuration 主要是 覆盖 Feign 默认的Encoder
@FeignClient(value = "upload-server", configuration = UploadService.UserFeignConfig.class)
public interface UserFeignService {
@PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String fileUpload(@RequestPart(value = "file") MultipartFile file);
@Configuration
class UserFeignConfig{
@Bean
public Encoder feignFormEncoder() {
return new SpringFormEncoder();
}
}
}
调用
然后在Controller中调用UserFeignService.fileUpload 即可
// 后面在补充如何将File转为 MultipartFile
注:不要忘记在 启动类 添加注解
@EnableFeignClients