公司用的spring cloud项目,需要用到feign上传文件到另一个服务。
首先,默认feign是不支持文件传输的,需要给feign增加插件.(spring boot版本:2.0.5.RELEASE)
1. 首先给feign加入支持文件传输的插件maven支持:
<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>
2. 为feign接口所在java文件指定配置文件类FeignConfig,在其中配置表单的参数Encoder实例(不配置encoder会使用feign默认的encoder,具体哪个类待以后研究,这也是feign不支持文件传输的根本原因!)
@Configuration
public class FeignConfig {
@Bean
public feign.codec.Encoder feignFormEncoder() {
return new SpringFormEncoder();
}
}
3.为对外接口声明类指定刚才新建的config类.
同时在文件传输接口上指定两个header:@Headers(value={"Content-Type: multipart/form-data","accept: multipart/form-data"}),指明请求是文件流传输
4.接口形参上增加@RequestPart注解,标记参数类型为文件
@FeignClient(value = "user",configuration = FeignConfig.class)
public interface WeiboFeignService {
@Headers(value={"Content-Type: multipart/form-data","accept: application/json;charset=UTF-8"})
@RequestMapping(value = "/api/user/upload_head", consumes = MediaType.MULTIPART_FORM_DATA_VALUE,method = RequestMethod.POST)
public String uploadPic(@RequestPart("image")MultipartFile image,@RequestParam("weiboUid")String weiboUid);
}
好了,去试试看能不能用吧