springcloud微服务之间通过feign调用方式上传文件MultipartFile

通过我们使用spring系列的框架上传文件,都会利用MultipartFile文件流进行文件的上传。但是我在最近的项目中遇到一个问题,我们的项目是基于springboot框架的springcloud微服务搭建的,后端服务技术层面整体上分为business服务和core服务,business服务用于作为应用层,直接连接用户端,通常用于聚合数据,core服务用于基本很少变动的非业务核心接口。那么用户的上传过程实现,就要通过前端页面调用business服务上传接口,然后business服务调用core服务的上传接口实现文件上传。在服务与服务之间通过feign调用时,发现MultipartFile文件流上传文件会报错。经过不断摸索以及网上的方案。最终解决了,现在把问题方案贴出来,希望能帮到有需要的开发者朋友。

一、编写配置类

编写一个配置类,也就是把multipart/form-data格式的文件流编码为spring框架能够解析的格式

@Configuration
public class MultipartSupportConfig {

    @Autowired
    private ObjectFactory messageConverters;
 
    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(messageConverters));
    }
}

二、服务调用方加注解类

/**
 * @author guobinhui
 * @date 2019/10/31
 */
@FeignClient(name="xxxx", configuration = MultipartSupportConfig.class)
public interface CreditEvaluationClient {
 
    @ApiOperation(value = "信用评估上传营业执照", notes = "信用评估上传营业执照")
    @PostMapping(value="/custevaluation/uploadFile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public DataResponseEntity uploadFile(@RequestPart("file") MultipartFile multipartFile,@RequestParam("custId") String custId)throws FastDfsException;

三、被调用的服务接收文件流

    @ApiOperation(value = "信用评估上传营业执照", notes = "信用评估上传营业执照")
    @PostMapping("/uploadFile")
    public ResponseEntity  uploadFile(@RequestPart("file") MultipartFile multipartFile,@RequestParam("custId") String custId)throws FastDfsException{
        String fileName = multipartFile.getOriginalFilename();
        String ext = fileName.substring(fileName.indexOf(".")+1, fileName.length());
        if(!ext.equals("pdf") && !ext.equals("jpg") && !ext.equals("png")){
            return ResponseHelper.fail(MsConstant.ILLEGAL_FILE_EXT);
        }
        String path = custEvalService.uploadFile(multipartFile,custId);
        return ResponseHelper.success(path);
    }

注意:文件流要用RequestPart注解传参,其余参数用RequestParam注解传参

你可能感兴趣的:(Java基础)