先說一下調用流程:
頁面請求 -> 服務A中的controller -> 服務A的feign Interface -> 服務B的controller
springcloud和其他架構不同的是需要跨子產品地調用接口,是以如果在傳遞檔案參數的時候不進行特殊處理的話是沒辦法成功調用接口的。
首先處理服務A:
需要加入對應的依賴(如果springboot版本高于2.0,feign-form-spring的版本最好不低于3.5):
<!-- Feign進行跨服務傳遞檔案依賴 -->
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.0.3</version>
</dependency>
然後你需要在feign接口中引入一個配置類
@FeignClient(name = "${feign.xxx.name}",configuration = IProductDocService.MultipartSupportConfig.class)
public interface IProductDocService {
@Scope("prototype")
@Primary
@Configuration
class MultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder() {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
}
}
其次,在服務A中的配置檔案配置如下内容:
multipart.enabled=true
multipart.file-size-threshold=0
# 最大支援檔案大小
multipart.maxFileSize=10MB
multipart.maxRequestSize=10MB
配置工作到這裡就完成了,接下來在書寫feign接口的時候要注意了,你可以參照着這樣子來寫
@RequestMapping(value = "/test",method = RequestMethod.POST,produces = { MediaType.APPLICATION_JSON_UTF8_VALUE }, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String test(@RequestPart(value = "file", required = false) MultipartFile file,@RequestParam(value = "name") String name);
其中【consumes = MediaType.MULTIPART_FORM_DATA_VALUE】是必須的,否則人家怎麼知道你傳的是檔案呢
第二個是對于檔案你不能使用@RequestParam了,要使用@RequestPart,不然就會報這個異常:
Could not parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
再處理服務B:
服務B的controller:

配置檔案:
spring.http.multipart.enabled=true
spring.http.multipart.file-size-threshold=0
# 最大支援檔案大小
spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=10MB
然後~大功告成~