feign进行微服务间的文件上传下载,springCloud版本Finchley.RELEASE,非主流版本

编程

先理下思路,和网上一般情况下feign之间传文件有什么不同的

1 版本,我们使用的版本可能不同,我使用的springcloud版本是 Finchley.RELEASE,请参考官方文档的话:https://github.com/OpenFeign/feign-form

The feign-form extension depend on OpenFeign and its concrete versions:

  • all feign-form releases before 3.5.0 works with OpenFeign 9.* versions;
  • starting from feign-form"s version 3.5.0, the module works with OpenFeign 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 with OpenFeign before 10.*. OpenFeign was refactored in 10th release, so the best approach - use the freshest OpenFeign and feign-form versions.

Notes:

  • spring-cloud-openfeign uses OpenFeign 9.* till v2.0.3.RELEASE and uses 10.* after. Anyway, the dependency already has suitable feign-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 the OpenFeign"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>

<!--fileMultipartFile-->

<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)

@ResponseBody

public 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

回到顶部