场景:
最近在项目中遇到了一个问题,项目本来使用SpringBoot开发,要写一个接口提供给前端,而我们的接口拿到前端的文件后,向另一个SpringBoot项目的服务发送文件(注:发送的文件类型为MultipartFile)。
解决方案:
先设置请求头,这个很简单,直接用HttpHeaders类即可:
//封装请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE + ";charset=UTF-8");
httpHeaders.set("test1", "1");
httpHeaders.set("test2", "2");
首先,我们拿到文件后,为了发送请求到另一个服务器,则把MultipartFile类型的文件转换成Java的File类型。
转换完后将File对象转成FileSystemResource。
//文件处理
FileSystemResource resource = new FileSystemResource(multipartFile2File(file));
转换器
private static File multipartFile2File(@NonNull MultipartFile multipartFile) {
// 获取文件名
String fileName = multipartFile.getOriginalFilename();
// 获取文件前缀
String prefix = fileName.substring(0, fileName.lastIndexOf("."));
//获取文件后缀
String suffix = fileName.substring(fileName.lastIndexOf("."));
try {
//生成临时文件
File file = File.createTempFile(prefix, suffix);
//将原文件转换成新建的临时文件
multipartFile.transferTo(file);
file.deleteOnExit();
return file;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
其次,使用MultiValueMap实例化一个LinkedMultiValueMap,当作post请求的请求体里multipart/form-data类型的数据
然后将一些参数和已经转换好后的文件放在这个MultiValueMap中:
//表单处理
MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
form.add("FileList", resource);
form.add("Type", "type");
//其他multipart/form-data数据
form.add("test", "test");
准备好这些数据以后,使用org.springframework.http
包下的HttpEntity
封装请求体:
HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, httpHeaders);
最终使用restTemplate
实例的postForObject
方法直接发送请求即可:
RestTemplate restTemplate = new RestTemplate();
//发送请求,:目标服务器接口地址、请求体、返回类型(可自定义,我这里是使用的Result类)
Result<?> result = restTemplate.postForObject(url, files, Result.class);
拿到请求结果后即可进行后续的处理了。
完整的代码块:
try {
String url="服务器2中接口的地址";
//封装请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE + ";charset=UTF-8");
httpHeaders.set("test1", "1");
httpHeaders.set("test2", "2");
//文件处理
FileSystemResource resource = new FileSystemResource(multipartFile2File(file));
//表单处理
MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
form.add("FileList", resource);
form.add("Type", "type");
form.add("test", "test");
HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, httpHeaders);
RestTemplate restTemplate = new RestTemplate();
//发送请求
Result<?> result = restTemplate.postForObject(url, files, Result.class);
if (result.isSuccess()) {
//后续处理
return Result.OK();
}
return Result.error(result.getMessage());
} catch(Exception e){
e.printStackTrace();
}