通過我們使用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注解傳參