需求
通常我们会有这样的需求,一个服务上传文件给另一个服务
服务提供端
@PostMapping(value = "/uploadFile")
public String uploadFile(@RequestParam MultipartFile multipartFile){
System.out.println("文件服务器接收到文件:"+multipartFile.getOriginalFilename());
return "suceess";
}
服务调用端
pom.xml 添加三个依赖包
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
FeignClient 上传文件接口 consumes = MediaType.MULTIPART_FORM_DATA_VALUE,设置表单编码
@FeignClient("server")
public interface UploadFileClient {
/**
* test
* @return
*/
@RequestMapping(value = "/test")
String test();
/**
* 文件上传
* @param multipartFile
* @return
*/
@RequestMapping(value = "/uploadFile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE,method = RequestMethod.POST)
String uploadFile(@RequestPart MultipartFile multipartFile);
@Configuration
class FeignMultipartSupportConfig {
@Bean
public Encoder feignFormEncoder() {
return new SpringFormEncoder();
}
}
}
文件上传, 如果是File,则 转 MultipartFile 然后上传:
File file = new File(fileName);
DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file",
MediaType.TEXT_PLAIN_VALUE, true, file.getName());
try (InputStream input = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()) {
IOUtils.copy(input, os);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid file: " + e, e);
}
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
uploadFileClient.uploadFile(multipartFile);