theme: smartblue
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
写在前面
Feign是微服务中服务间调用的优选组件,后来的OpenFeign也是基于此来开展的。
我会创建一个新的专栏,来保存我最近使用Feign的一些心得和问题点,欢迎大家关注。
为什么要通过Feign来传输文件?
我为什么要用Feign来传输文件,是因为在我目前的微服务框架中,文件存储的服务是独立分开的。
所以要保存文件到FTP或者其他静态资源服务器上,只能通过文件服务。
解决方案
shen说要有API,于是就有了如下API。
java @PostMapping(value = "/upload") public FileVO uploadFile(@RequestParam(value = "file") MultipartFile file){ return fileService.saveFile(file); }
API的编写和普通的controller接口一样,没有区别。
接着就是要有feign调用接口,于是有了如下Feign接口。
java /** * @param file * @return */ @PostMapping(value = "/file/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) GlobalFileVO uploadFile(@RequestPart(value = "file") MultipartFile file);
这里的feign接口需要极其特别注意的就是@RequestPart这个注解。
而且还需要声明PostMapping的consumes参数。
必须要使用这个注解,只有这个注解才能将文件传输到其他服务。
准备工作已完成,如何在业务代码中调用呢?
其实到这,大家在网上都能找到相似的问题解决办法。
相反调用的地方很多博客给出的答案并不灵活,如果你没找到其他的解决方案,那么我这个方法可能符合你的要求。
其实这里feign接口是需要一个MultipartFile对象。
MultipartFile本身又只是一个接口,这个时候就要选择实现MultipartFile接口的哪个实现类呢?哪个实现类又能符合我们的要求。
我给出的答案就是实现MockMultipartFile类。
通过这个类的实现,我们可以填充文件流、字节流、字节数组、文件名称都可以。
我给一个大概的代码实现,大家可以自行查看其源码,很清晰很容易就能看懂。
需要先引入下面这个包才行。
xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency>
java byte[] buffer = null; // ....... // MultipartFile file = new MockMultipartFile("文件名称", "文件名称.jpeg", ContentType.MULTIPART_FORM_DATA.toString(), buffer); return fileFeign.uploadFile(file);
这里需要指定ContentType,我在ContentType常量类中找到这个类型。
期间我遇到了哪些问题?
我当然也搜了一下别人都是如何实现的,但大多都是重复的帖子。
而且都是直接给出MultipartFile对象,或者是使用CommonsMultipartFile实现类。
CommonsMultipartFile这个类需要传输FileItem对象,当然这个方法也可以。
但总感觉不是很方便,所以才通过new的提示找到了MockMultipartFile实现类。
总结
Feign的文件传输并不常用,但是往往只用上一两次的功能,才是最重要的。