通过 Feign 进行文件上传

项目为spring cloud 项目,项目中对各部分能力业务进行了拆分,将公共的服务能力放在一个模块当中,通过Feign 的方式 进行调用,feign 调用的本质还是http内部通信请求,实现模块之间的调用。

生产端

正常写个controller

1
2
3
4
5
6
7
8
9
10
@RestController
@RequestMapping("/aaa")
public class testController{
@PostMapping(value="/upload")
@ResponseBody
public Result upload(@RequestPart("file") MultipartFile file) throws Exception {
// 文件处理
return Restult.succeed();
}
}

调用端

1
2
3
4
5
@FeignClient(value="aaa", configuration = FeignConfiguration.class, contextId = "bbbb")
public interface UploadClient {
@PostMapping(value = "/aaa/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String upload(@RequestPart(value = "file") MultipartFile file) throws Exception;
}

传文件需要添加请求头,但又不能加多了,不然会报feign.RetryableException: Incomplete output stream executing POST。所以只加自己用的就可以了

1
2
3
4
5
6
7
@Component
public class FeignConfiguration implements RequestInterceptor {
@Overide
public void apply(RequstTemplate requestTemplate) {
requestTemplate.header("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE);
}
}

@RequestPart、@RequestParam区别

  • @RequestPart这个注解用在multipart/form-data表单提交请求的方法上。
  • 支持的请求方法的方式MultipartFile,属于Spring的MultipartResolver类。这个请求是通过http协议传输的。
  • @RequestParam也同样支持multipart/form-data请求。
  • 他们最大的不同是,当请求方法的请求参数类型不再是String类型的时候。
  • @RequestParam适用于name-valueString类型的请求域,@RequestPart适用于复杂的请求域(像JSON,XML)。