3-8Feign 文件上传 · SpringCloud微服务实战 · 看云
7. Feign 文件上传
导航
之前我们应该都实现过文件上传的功能,那么通过服务调用的方式实现文件上传需要注意什么呢?方式肯定是有区别
本节代码地址
GitHub: https://github.com/xuyisu/fw-sping-cloud/tree/master/fw-cloud-feign/fw-cloud-feign-okhttp
GitHub: https://github.com/xuyisu/fw-sping-cloud/tree/master/fw-cloud-upload
7.1 新建上传项目
新建上传项目,后续的项目上传都可以走此公共上传服务
7.2 maven 配置
此服务我们后续希望可以通过Eureka 注册中心实现服务之间的调用,因此加上spring-cloud-starter-netflix-eureka-client包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
7.3 新建启动类
@EnableDiscoveryClient
@SpringBootApplication
public class FwUploadApplication {
public static void main(String[] args) {
SpringApplication.run(FwUploadApplication.class, args);
}
}
7.4 新建控制层
下面我们需要提供一个统一的上传接口,默认的上传路径是D:/fw/file/,如果你是Windows或者Mac,需要替换路径。
@RestController
@Slf4j
public class UploadController {
@PostMapping(value = "/uploadFile")
public String uploadFile(MultipartFile file) throws Exception {
log.info("upload file name : {}", file.getName());
file.transferTo(new File("D:/fw/file/" + file.getOriginalFilename()));
return file.getOriginalFilename();
}
}
7.5 添加项目配置文件
server:
port: 8871
spring:
application:
name: fw-cloud-upload
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
7.7 启动上传服务
利用Postman 测试,输入localhost:8771/uploadFile,需要注意下面几个标红框的部分,否则不能测试文件上传。
7.8 调整Feign项目配置
这里需要在Feign 中调用上传服务,跟刚才的直接调用上传服务是有区别的,需要设置一些配置文件,有哪些配置,请继续往下看。首先我们需要修改maven依赖,添加Feign 上传需要的依赖包。
需要注意的事,有些低版本的包不适合高版本的Spring Cloud ,需要调试最合适你的版本
<!-- Feign文件上传依赖-->
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>${form.version}</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>${form.version}</version>
</dependency>
7.9 设置Feign上传需要的配置
@Configuration
public class FeignMultipartSupportConfiguration {
@Bean
@Primary
@Scope("prototype")
public Encoder multipartEncoder(){
return new SpringFormEncoder();
}
}
7.10 新建Feign调用接口并引入配置文件
上一步的配置上传编码配置主要是为了在当前Feign接口中配置configuration = FeignMultipartSupportConfiguration.class,否则调用上传服务会失败。注意区分@RequestPart和RequestParam,不要将 @RequestPart(value = "file") 写成@RequestParam(value = "file")
@RequestPart与@RequestParam的区别
- @RequestPart这个注解用在multipart/form-data表单提交请求的方法上。
- @RequestPart支持的请求方法的方式MultipartFile,属于Spring的MultipartResolver类。这个请求是通过http协议传输的。
- @RequestParam也同样支持multipart/form-data请求。
- 他们最大的不同是,当请求方法的请求参数类型不再是String类型的时候。
- @RequestParam适用于name-valueString类型的请求域, @RequestPart适用于复杂的请求域(像JSON,XML
@FeignClient(value = "fw-cloud-upload", configuration = FeignMultipartSupportConfiguration.class)
public interface FileUploadFeignService {
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String uploadFile(@RequestPart(value = "file") MultipartFile file);
}
7.11 在控制成添加请求方法
@PostMapping(value = "/upload")
public String upload(MultipartFile file){
return fileUploadFeignService.uploadFile(file);
}
7.12 重启fw-cloud-feign-client项目
利用Postman 测试localhost:8771/upload
我们在D:/fw/file/验证下是不是文件已上传成功



