场景:
在A应用里面提供web接口给前端接收上传的文件,然后A应用再通过feign接口调用B应用,将文件进行传输,B应用真正处理文件上传到服务器,同时上传文件时除了文件参数还有其他额外的参数。
一开始想当然的简单写了web接口和feign接口,结果测试各种报错,比如以下几个错误:
1、Current request is not a multipart request
2、the request was rejected because no multipart boundary was found
3、Required request part ‘file’ is not present
经过排查修改终于解决了,直接上最后成功的代码,如下:
1、应用A提供的web接口
@RestController
@RequestMapping("/upload")
public class UploadAController
@Autowired
private UploadClient uploadClient;
@PostMapping(value = "/lyc/test/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
BizResponse<String> uploadFile(@RequestPart("file") MultipartFile file, String extraParam){
return uploadClient.upload(file, extraParam);
}
}
2、调用方应用A的feignClient定义
@FeignClient(name = "test-B")
public interfact UploadClient{
@PostMapping(value = "/lyc/test/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
BizResponse<String> upload(@RequestPart("file") MultipartFile file, @RequestParam(value = "extraParam",required = false)String extraParam)
}
3、提供方应用B的文件上传接口:
@RestController
@RequestMapping("/upload")
public class UploadBController
@Autowired
private UploadService uploadService;
@PostMapping(value = "/lyc/test/uploadFile")
BizResponse<String> upload(@RequestParam("file") MultipartFile file, String extraParam){
return uploadService.doUpload(file, extraParam);
}
}
需要注意这几个点:
(1)feign接口多个参数必须加上consumes = MediaType.MULTIPART_FORM_DATA_VALUE,而且对应的file要用@RequestPart
(2)@RequestPart(“file”),这里的“file”定义接口调用方和提供方必须一致
(3)feign实现文件上传还需要引入依赖
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>xxx</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>xxx</version>
</dependency>