MultipartFile是Spring框架中提供的一种用于文件处理的接口,一般用于前端进行文件的上传,后端使用MultipartFile类型来进行文件的接收;当使用RestTemplate的post方法进行来传递接收到的MultipartFile类型文件时,由于RestTemplate中并没有对应的转化器(Converter),无法将文件对象打包进body中,所以会抛出异常。
办法:先将MultipartFile类型的对象转化为File类型,一下为转换的方法
/**
* 将MultiPartFile转化为File
* @param path
* @param multiFile
* @return https://blog.csdn.net/qgnczmnmn/article/details/107087347
* @throws IOException
*/
public File multiPartFileToFile(String path, MultipartFile multiFile) {
try {
File file=new File(path);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
multiFile.transferTo(file);
return file;
} catch (IOException e) {
throw new PlanException(EamErrorType.MC_FILE_EXCEPTION.getValue(), e.getMessage());
}
}
实例:
@Override
public void uploadMdAndApply(MicrolightMaterialUploadDTO microlightMaterialUploadDTO) {
// - 获得文件的尾缀,存储在本地空间
MultipartFile file = microlightMaterialUploadDTO.getFile();
String name = file.getOriginalFilename();
String suffix = name.substring(name.lastIndexOf(".") + 1);
String path= rpcConfigInfo.getFileUrl()+suffix;
File tempFile = this.multiPartFileToFile(path, file);
// - 调用mc的http接口的文件上传
MultiValueMap<String,Object> map = new LinkedMultiValueMap<>();
map.add("file",new FileSystemResource(tempFile));
map.add("type",microlightMaterialUploadDTO.getType());
HttpHeaders headers = new HttpHeaders();
headers.add("tokenid", PermissionAspect.getTokenid());
headers.add("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE);
headers.add("Accept", "*/*");
headers.add("Connection", "keep-alive");
headers.add("User-Agent", "PostmanRuntime/7.28.4");
headers.add("Accept-Encoding", "gzip, deflate, br");
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity(map, headers);
ResponseEntity<JSONObject> entity = null;
try {
entity = restTemplate.postForEntity(rpcConfigInfo.getMcFileUrl(), requestEntity, JSONObject.class);
} catch (RestClientException e) {
throw new PlanException(EamErrorType.PC_MC_ERROR.getValue(), e.getMessage());
}
// - 删除文件
try {
Path path1 = Paths.get(path);
Files.deleteIfExists(path1);
} catch (IOException e) {
e.printStackTrace();
}
}