feign进行微服务间的文件上传下载,springCloud版本Finchley.RELEASE,非主流版本
先理下思路,和网上一般情况下feign之间传文件有什么不同的
1 版本,我们使用的版本可能不同,我使用的springcloud版本是 Finchley.RELEASE,请参考官方文档的话:https://github.com/OpenFeign/feign-form
The
feign-form
extension depend onOpenFeign
and its concrete versions:
- all
feign-form
releases before 3.5.0 works withOpenFeign
9.* versions;- starting from
feign-form
"s version 3.5.0, the module works withOpenFeign
10.1.0 versions and greater.IMPORTANT: there is no backward compatibility and no any gurantee that the
feign-form
"s versions after 3.5.0 work withOpenFeign
before 10.*.OpenFeign
was refactored in 10th release, so the best approach - use the freshestOpenFeign
andfeign-form
versions.Notes:
spring-cloud-openfeign uses
OpenFeign
9.* till v2.0.3.RELEASE and uses 10.* after. Anyway, the dependency already has suitablefeign-form
version, see dependency pom, so you don"t need to specify it separately;
spring-cloud-starter-feign
is a deprecated dependency and it always uses theOpenFeign
"s 9.* versions.
这一块的问题我是不能确认的,没找到具体该用哪个版本
2 我上传的是file,所以先进行了file 转 MutiparFile ,可能这里有问题
3 我接收文件的时候,有多个参数,而网上大部分的代码都是单个参数,会不会是传参
好了,上代码,先确定版本
<!--版本管理--><properties> <spring-mock-version>2.0.8</spring-mock-version><!--feign支持文件-->
<feign-form-version>2.1.0</feign-form-version>
</properties>
<!--feign支持文件上传--><dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>${feign-form-version}</version></dependency><dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>${feign-form-version}</version></dependency><!--file转MultipartFile-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-mock</artifactId>
<version>${spring-mock-version}</version>
</dependency>
添加feign的文件上传支持。
import feign.codec.Encoder;import feign.form.spring.SpringFormEncoder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/**
* @author :LX
* 创建时间: 2020/5/6. 18:18
* 地点:广州
* 目的: 用于支持feign支持上传文件
* 备注说明:
*/
@Configuration
public class FeignSupportConfig {
@Bean
public Encoder feignFormEncoder() {
return new SpringFormEncoder();
}
}
import org.springframework.cloud.openfeign.FeignClient;import org.springframework.http.MediaType;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RequestPart;import org.springframework.web.multipart.MultipartFile;import java.util.List;
/**
* @author :LX
* 创建时间: 2020/4/20. 14:27
* 地点:广州
* 目的: 统一资源管理服务
* 备注说明:
*/
@FeignClient(name = "resource", configuration = FeignSupportConfig.class)
public interface ResourceAdminFeignImp {
@PostMapping(value = "/rAdmin/test/xxxxxx", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResultJson xxxxxx(@RequestPart(value = "file", required = false) MultipartFile file, @RequestParam("name")String name);
}
上面的 代码我进行了一些处理,隐藏了一些敏感信息。但要注意的就2点,@RequestPart注解来修饰你要传的文件 , 还有 @FeignClient(name = "resource", configuration = FeignSupportConfig.class) 引入你的配置。
这里在加一个方法,
/** * 文件转 MultipartFile * @param file 文件* @return* @throws IOException */private MultipartFile fileToMultipartFile(File file) throws IOException {FileInputStream inputStream = new FileInputStream(file);MultipartFile multi = new MockMultipartFile(file.getName(), inputStream); return multi;}
我就是用上面的这个方法将file转换为multipartFile 文件,不能直接传file。
接下来就是关键的位置,大部分的代码这里都是用的普通写法,但我一直拿不到数据,后面断点检查的时候发现,实际上已经传数据过来了,没帮你封装而已。
@RequestMapping(value = "/xxxxxx", method = RequestMethod.POST)@ResponseBodypublic ResultJson xxxxxx(HttpServletRequest request, @RequestParam("name")String name) throws IOException, ServletException {Collection<Part> parts = request.getParts(); if (parts == null){return new ResultJson("上传文件为空");}InputStream stream = null; for (Part p: parts){stream = p.getInputStream();//这里默认只会传一个文件过来,不会有多个,有多个就有问题了continue;}return new ResultJson("上传成功", pathFinal);
}
如上,一些代码出于安全考虑就隐藏了,命名也改了下,大家能看懂就行,我这里直接使用的是 request 里面去拿数据,Collection<Part> parts = request.getParts(); 中就是你的数据,迭代遍历后,InputStream stream = null; 就是你的数据,等于每一个输入流就是你传过来的参数,到了这一步,就剩下你将流写到文件里面即可。
以上是 feign进行微服务间的文件上传下载,springCloud版本Finchley.RELEASE,非主流版本 的全部内容, 来源链接: utcz.com/z/516221.html