在Spring Cloud 的Feign組件中並不支持文件的傳輸,會出現這樣的錯誤提示:
feign.codec.EncodeException: class [Lorg.springframework.web.multipart.MultipartFile; is not a type supported by this encoder. at feign.codec.Encoder$Default.encode(Encoder.java:90) ~[feign-core-9.5.1.jar:na] at feign.form.FormEncoder.encode(FormEncoder.java:87) ~[feign-form-3.3.0.jar:3.3.0] at feign.form.spring.SpringFormEncoder.encode(SpringFormEncoder.java:64) ~[feign-form-spring-3.3.0.jar:3.3.0]
但是我們可以通過使用Feign的擴展包實現這個功能。
一. 示例介紹
服務名 | 端口號 | 角色 |
feign_upload_first | 8100 | feign服務提供者 |
feign_upload_second | 8101 | feign服務消費者 |
我們調用feign_upload_second的上傳文件接口上傳文件,feign_upload_second內部使用feign調用feign_upload_first實現文件上傳。
二 、單文件上傳
2.1 feign_upload_first服務提供者
文件上傳的服務提供者接口比較簡單,如下所示:
@SpringBootApplication public class FeignUploadFirstApplication { @RestController public class UploadController { @RequestMapping(value = "/uploadFile",method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) { return file.getOriginalFilename(); } } public static void main(String[] args) { SpringApplication.run(FeignUploadFirstApplication.class, args); } }
2.2 feign_upload_second服務消費者
- 增加擴展包依賴,依賴包不能太高級,會報錯
<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>
- 新增feign實現文件上傳的配置類
import feign.codec.Encoder; import feign.form.spring.SpringFormEncoder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignSupportConfig { @Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(); } }
- feign遠程調用接口
@FeignClient(name = "file",url = "http://localhost:8100",configuration = FeignSupportConfig.class) public interface UploadService { @RequestMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) String handleFileUpload(@RequestPart(value = "file") MultipartFile file); }
- 上傳文件接口
@RestController public class UploadController { @Autowired UploadService uploadService; @RequestMapping(value = "/uploadFile",method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) { return uploadService.handleFileUpload(file); } }
2.3 測試
使用postman進行測試,可以正常上傳文件