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