工作中遇到了一个网关接收multipartFile类型图片,然后转发到后台服务的需求,项目是基于springCloud的分布式框架,要求在网关层接收到服务后,组装相关信息,再转发到后台服务作具体处理,转发方式通过restTemplate调用,代码如下:
网关层接收:
@ApiOperation(value = "图片上报")
@PostMapping(value = "/upload/img/{id}")
@RecordSystemLog
public Object uploadFaceimg(@RequestParam Long time, @RequestParam("faceimg") MultipartFile faceimg, @PathVariable UUID id) throws {
service.uplod(faceimg, id, time);
return true;
}
网关service层:
public void upload(MultipartFile imageMulti, UUID id, Long time) {
//构建请求地址
String api = getUploadPath();
api = api + "?id=" + id.toString();
//restTemple不能传输File和MulipartFile,转为FileSystemResource后传输
//构建FileSystemResource需要文件类型为File,因此先将MulipartFile转为File
//convertTemporaryPath转换临时地址
File image = ConvertUtil.multipartFileToFile(imageMulti, convertTemporaryPath);
try {
FileSystemResource resource = new FileSystemResource(image);
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("faceimg", resource);
param.add("time", time);
//使用HttpEntity构建需要传递的参数
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(param);
restTemplate.postForEntity(api, httpEntity, CustomerDetectInfo.class).getBody();
} catch (RestClientException e) {
e.printStackTrace();
} finally {
image.delete();
}
}
转换工具:
public static File multipartFileToFile(MultipartFile file, String convertBasePath) {
if (file != null) {
File base = new File(convertBasePath);
if (!base.exists()) {
base.mkdirs();
}
String filePath = convertBasePath + file.getName() + String.valueOf((int) (100000 * Math.random())) + ".jpeg";
File conventFile = new File(filePath);
try {
boolean isCreateSuccess = conventFile.createNewFile();
if (isCreateSuccess) {
file.transferTo(conventFile);
return conventFile;
}
} catch (IOException e) {
log.warn("multipartFile convert to File failed -> " + e.getMessage());
}
}
return null;
}
后台服务接收代码:
@ApiOperation(value = "图片上传")
@PostMapping(value = "/upload/{id}")
@RecordSystemLog
//传递参数用@RequestParam接收
public Object search(@RequestParam("faceimg") MultipartFile faceimg, @PathVariable UUID id, @RequestParam("time") String time) {
//具体业务代码
}
部分代码有使用到其他作者文章内容,但是忘记链接地址了,抱歉。