在Spring Cloud封裝的Feign中并不直接支持傳文件,但可以通過引入Feign的擴展包來實現,本文就來具體說說如何實現。需要JAVA Spring Cloud大型企業分布式微服務云構建的B2B2C電子商務平臺源碼 一零三八七七四六二六
服務提供方(接收文件)
服務提供方的實現比較簡單,就按Spring MVC的正常實現方式即可,比如:
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class Application {@RestControllerpublic class UploadController {@PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) {return file.getName();}}public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}}
復制代碼
服務消費方(發送文件)
在服務消費方由于會使用Feign客戶端,所以在這里需要在引入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>
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version>
</dependency>
復制代碼
定義文件上傳方的應用主類和FeignClient,假設服務提供方的服務名為 eureka-feign-upload-server
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}}@FeignClient(value = "upload-server", configuration = UploadService.MultipartSupportConfig.class)
public interface UploadService {@PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)String handleFileUpload(@RequestPart(value = "file") MultipartFile file);@Configurationclass MultipartSupportConfig {@Beanpublic Encoder feignFormEncoder() {return new SpringFormEncoder();}}}
復制代碼
在啟動了服務提供方之后,嘗試在服務消費方編寫測試用例來通過上面定義的Feign客戶端來傳文件,比如:
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UploadTester {@Autowiredprivate UploadService uploadService;@Test@SneakyThrowspublic void testHandleFileUpload() {File file = new File("upload.txt");DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file",MediaType.TEXT_PLAIN_VALUE, true, file.getName());try (InputStream input = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()) {IOUtils.copy(input, os);} catch (Exception e) {throw new IllegalArgumentException("Invalid file: " + e, e);}MultipartFile multi = new CommonsMultipartFile(fileItem);log.info(uploadService.handleFileUpload(multi));}}
復制代碼
java B2B2C 仿淘寶電子商城系統