一、服务端
@PostMapping(path = "/uploadFile")
@ResponseBody
public ObjectRestResponse<String> uploadFile(@RequestParam MultipartFile file,@RequestParam String uploadFilePath) {
//这里是上传文件逻辑代码
}
二、客户端
1.引入依赖
(我使用的OpenFeign是9.5.0版本)
<!--解决feign传递参数类型为MultipartFile的问题-->
<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>
这里注意feign-form与OpenFeign的版本对应关系
官方介绍:https://github.com/OpenFeign/feign-form
- OpenFeign为9.*时使用feign-form3.5.0以前版本
- OpenFeign为10.1.0以后版本时使用feign-form3.5.0之后的版本
2.配置类
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.cloud.netflix.feign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 这里注入的feignFormEncoder可以覆盖掉原本的encoder
* 辅助feign传输multipartFile
*/
@Configuration
public class FeignMultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public SpringFormEncoder feignFormEncoder () {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
}
3.FeignClient
//file-service是服务提供者
@FeignClient(name = "file-service", configuration = FeignMultipartSupportConfig.class)
public interface FileService {
@PostMapping(value = {"/fileServer/uploadFile"}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ObjectRestResponse<String> uploadFile(@RequestPart("file") MultipartFile file,@RequestParam("uploadFilePath") String uploadFilePath);
}
- 注意配置configuration = FeignMultipartSupportConfig.class
- 使用@RequestPart而不是@RequestParam
- @PostMapping设置 consumes = MediaType.MULTIPART_FORM_DATA_VALUE
4.Controller
@Autowired
private FileService fileService;
@PostMapping(value = "/testFile")
public void testFile(@RequestPart("file") MultipartFile file, @RequestParam("uploadFilePath")String uploadFilePath){
ObjectRestResponse<String> res=fileService.uploadFile(file,uploadFilePath);
}