feign传文件这个还是有很多案例的,随笔记一下
1、首先引入feign的依赖和开启@EnableFeignClients这些基础就不用说了
2、自定义feign接口,由于调用的是外部服务所以在feignclient上配置url,如果在一个注册中心就不用了呗
3、定义feign接口,方法可以使用RequestBody也可以用RequestPart
@FeignClient(value = "backgroundUrl", url = "${background-url}", fallback = BackGroundServiceFallBack.class)
public interface BackGroundService {
@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String uploadFileTest(@RequestBody MultipartFile file);
}
这里注意一定要指定consumes,如果不改成multipart/form-data服务中的方法是没办法转换multipartfile的
4、这里才是记录的重点,如果是表单直接上传,就直接将传上来的MultipartFile传给接口就可以了,但是我这需要模拟一个上传,所以需要手动将file转换成MultipartFile
这里用的commons.fileupload里的方法,下面列一个demo
注意createItem方法的第一个参数是你服务接受的参数名称,这个如果与服务接收不一致会是null的,第二个参数是你组装的类型,由于指定了consumes,这里写什么都可以,第三个参数是否是模拟表单,true/false均可,第四个参数是文件名称了。
@RequestMapping("test")
@ResponseBody
public void test() {
File file = new File("D:\\test.txt");
DiskFileItemFactory factory = new DiskFileItemFactory();
FileItem item = factory.createItem("file", "text/plain", true, file.getName());
int bytesRead = 0;
byte[] b = new byte[8192];
try {
FileInputStream fileInputStream = new FileInputStream(file);
OutputStream outputStream = item.getOutputStream();
while (((bytesRead = fileInputStream.read(b, 0, 8192)) != -1)) {
outputStream.write(b, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
MultipartFile multipartFile = new CommonsMultipartFile(item);
System.out.println(multipartFile.getOriginalFilename());
backGroundService.uploadFileTest(multipartFile);
}
5、服务发布就是正常的接受方法即可
@PostMapping(value = "/upload")
@ResponseBody
public void uploadFileTest(@RequestBody MultipartFile file) {
String s = filess.getOriginalFilename();
System.out.println(s);
}
以上就是模拟表单提交的方式将file转换为MultipartFile通过feign方式传递。