天天看點

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<HttpMessageConverters> 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注解傳參