这两天老大突然交给一个任务,就是当用户关注我们的微信号时,我们应该将其微信头像下载下来,然后上传到公司内部的服务器上。如果直接保存微信头像的链接,当用户更换微信头像时,我们的产品在获取用户头像很可能会出现404异常。
由于公司运用的技术栈为Spring Cloud(一些Eureka, Feign)进行服务注册和远程调用。
重点来了。。。。但直接使用FeignClient去远程调用注册中心上的上传文件接口,会一直报错。
@PostMapping
@ApiOperation(value = "上传文件")
public String fileUpload(@ApiParam(value = "文件", required = true) @RequestParam("file") MultipartFile multipartFile,
@ApiParam(value = "usage(目录)", required = false) @RequestParam(value = "usage", required = false) String usage,
@ApiParam(value = "同步(可选,默认false)") @RequestParam(value = "sync", required = false, defaultValue = "false") boolean sync) {
if (multipartFile == null) {
throw new IllegalArgumentException("参数异常");
}
String url = map.get(key).doUpload(multipartFile, usage, sync);
return UploadResult.builder().url(url).build();
}
远程的上传文件的接口。
@FeignClient("dx-commons-fileserver")
public interface FileServerService {
@RequestMapping(value="/file", method = RequestMethod.POST)
public String fileUpload(
@RequestParam("file") MultipartFile multipartFile,
@RequestParam(value = "usage", required = false) String usage,
@RequestParam(value = "sync", required = false, defaultValue = "false") boolean sync);
}
普通的FeignClient远程调用代码。但是这样的实现,在去调用的时候一直抛异常:MissingServletRequestPartException,"Required request part 'file' is not present"
这里去跟踪:fileServerService.fileUpload(multipartFile, null, true)源码发现发送的url是将multipartFile以url的方式拼接在query string上。所以这样的调用肯定是不行的。
那从百度搜索了一下关键词: feign upload 会看到有这样一种解决方案:
(原文转自:http://www.jianshu.com/p/dfecfbb4a215)
maven
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>2.1.0</