我在网上查了很多关于 Spring Cloud 文件上传的相关资料也花费了不少时间,根据他们提供的方案修改也没有得到解决,经过自己探讨与摸索,终于解决了我的问题,也与大家分享了下,如下:
一、项目结构
首先介绍一下项目结构,我们开发的项目结构比较简单
xxx-api工程:这个工程主要是对外提供接口.
service-xxx工程:这个工程承载核心业务处理服务
二、上代码
对于开发者来说,看代码比较实在,如下:
xxx-api工程下的文件上传相关代码:
1、xxx-api项目的 Controller类 至关重要的 @RequestPart 注解
@PostMapping(path = "/uploadImg")
public Result<String> uploadImg(@RequestPart("file") MultipartFile file, @RequestHeader String accessToken) {
Resp result = authService.authUserByToken(accessToken);
if (result.getCode() > -1) {
String accountId = BeanUtil.beanToMap(result.getData()).get("account").toString();
return filePoolService.uploadImg(file, accountId);
} else {
return Result.fail("获取用户信息失败,请重新尝试");
}
}
2、FeginClient类 注意标注 @PostMapping(path = "/api/file/uploadImg",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) 和 @RequestPart 注解
/**
* @param file 文件
* @param accountId 用户唯一ID
* @return 结果说明
*/
@PostMapping(path = "/api/file/uploadImg",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result<String> uploadImg(@RequestPart("file") MultipartFile file, @RequestParam String accountId);
二、service-xxx 工程,如下: 至关重要的 @RequestPart 注解
@PostMapping(path = "/uploadImg")
public Result<String> uploadImg(@RequestPart("file") MultipartFile file,@RequestParam String accountId) throws Exception {
if (file.isEmpty()) {
return Result.fail("没有要上传的文件");
}
BufferedImage image = ImageIO.read(file.getInputStream());
if (image == null) {
return Result.fail("文件错误");
}
byte[] imageInByte = ImgDealUtils.compress(image);
String name = "";
String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf('.'));
if (fileName != null && !fileName.equals("")) {
name = fileName;
}
return Result.success(this.filePoolService.saveFile(name + ".jpg", accountId, imageInByte));
}
总结一下:
对于文件类微服务的调用,要用 @RequestPart 注解标注,在合适位置配合注解 @PostMapping(path = "/api/file/uploadImg",consumes =MediaType.MULTIPART_FORM_DATA_VALUE) 进行 修饰使用,否则会报资源类型和其他的一些问题。