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註解傳參

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章