feign-文件上传

425 阅读1分钟

feign-文件上传

开发流程

导包

<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
    <version>3.4.1</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form-spring</artifactId>
    <version>3.4.1</version>
</dependency>

编写服务端

@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MULTIPART_FORM_DATA_VALUE)
public Map<String, Object> upload(@RequestBody MultipartFile file, @RequestParam(value = "name") String name) throws IOException {
    Map<String, Object> map = new HashMap<>();
    map.put("size", file.getSize());
    map.put("type", file.getContentType());
    map.put("name", name);
    return map;
}

编写客户端

@FeignClient(name = "cdn")
public interface CdnService {
    @RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MULTIPART_FORM_DATA_VALUE)
    Map<String, Object> feignUpload(@RequestBody MultipartFile file, @RequestParam(value = "name") String name) throws IOException;
}
@Autowired
private CdnService cdnService;

@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MULTIPART_FORM_DATA_VALUE)
public Map<String, Object> upload(@RequestBody MultipartFile file, @RequestParam(value = "name") String name) throws IOException {
    return cdnService.upload(file, name);
}

踩坑记

上传文件的同时上传其他文件对象

不能这样写,会出现数据转换问题

版本问题

报错:

java.lang.ClassNotFoundException: feign.Request$Body
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_301]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_301]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) ~[na:1.8.0_301]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_301]
	at feign.form.MultipartFormContentProcessor.process(MultipartFormContentProcessor.java:104) ~[feign-form-3.8.0.jar:na]
	at feign.form.FormEncoder.encode(FormEncoder.java:105) ~[feign-form-3.8.0.jar:na]
	at feign.form.spring.SpringFormEncoder.encode(SpringFormEncoder.java:74) ~[feign-form-spring-3.8.0.jar:na]
	at feign.ReflectiveFeign$BuildEncodedTemplateFromArgs.resolve(ReflectiveFeign.java:345) ~[feign-core-9.5.1.jar:na]
	at feign.ReflectiveFeign$BuildTemplateByResolvingArgs.create(ReflectiveFeign.java:213) ~[feign-core-9.5.1.jar:na]
	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:72) ~[feign-core-9.5.1.jar:na]
	at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103) ~[feign-core-9.5.1.jar:na]
	at com.sun.proxy.$Proxy103.feignUpload(Unknown Source) ~[na:na]
	at com.cocos.s001.controller.CommonRestController.upload(UploadController.java:38) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_301]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_301]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_301]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_301]

解决方案一:

把 feign-form 的版本降低到 3.4.1

<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
    <version>3.4.1</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form-spring</artifactId>
    <version>3.4.1</version>
</dependency>

解决方案二:

需要的 feign-code 的版本高于 10.x

image.png