Spring Cloud Feign文件传输的示例代码
一、配置文件解析器
服务提供者和消费者都需要配置文件解析器,这里使用commons-fileupload替换原有的解析器:
依赖:
commons-fileupload commons-fileupload 1.3.1
注入bean:
@Bean(name="multipartResolver") publicMultipartResolvermutipartResolver(){ CommonsMultipartResolvercom=newCommonsMultipartResolver(); com.setDefaultEncoding("utf-8"); returncom; }
程序入口中剔除原有的解析器:
@SpringBootApplication(exclude={MultipartAutoConfiguration.class})
二、服务提供者,即接收文件一方的配置
Controller的写法:
@ResponseBody @RequestMapping(value="/upload",method={RequestMethod.POST}, produces={MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes=MediaType.MULTIPART_FORM_DATA_VALUE) publicResultuploadFile(@RequestPart("file")MultipartFilefile, @RequestParam("id")Longid){ StringfileName=file.getOriginalFilename(); Stringextend=FileOperateUtil.suffix(fileName); FileOperateUtil.copy("E:\\"+fileName,file); returnResultBuilder.success("ok"); }
@RequestPart指定文件,后面的@RequestParam是额外参数,注意额外参数不能超过url长度限制。
三、服务消费者配置
依赖:
io.github.openfeign.form feign-form-spring 3.2.2 io.github.openfeign.form feign-form 3.2.2
文件编码配置:
importfeign.codec.Encoder; importfeign.form.spring.SpringFormEncoder; importorg.springframework.beans.factory.ObjectFactory; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.boot.autoconfigure.web.HttpMessageConverters; importorg.springframework.cloud.netflix.feign.support.SpringEncoder; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; @Configuration publicclassMultipartSupportConfig{ @Autowired privateObjectFactorymessageConverters; @Bean publicEncoderfeignFormEncoder(){ returnnewSpringFormEncoder(newSpringEncoder(messageConverters)); } }
Feign接口定义:
@FeignClient(name="test-upload") publicinterfaceUploadService{ @ResponseBody @RequestMapping(value="/upload",method={RequestMethod.POST}, produces={MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes=MediaType.MULTIPART_FORM_DATA_VALUE) ResultuploadFile(@RequestPart("file")MultipartFilefile, @RequestParam("id")Longid); }
与普通Feign接口写法差不多,注意方法注解和参数与服务提供者的controller一样。
Controller的写法,Controller中接收前端传过来的文件信息和额外参数,然后通过Feign接口传输到远端:
//注入feign接口 @Autowired privateUploadServiceuploadService; @RequestMapping(value="/upload",method=RequestMethod.POST,produces="application/json;charset=utf-8") @ResponseBody publicResulttestUpload(HttpServletRequestrequest,Longid){ Result result=null; MultipartHttpServletRequestmRequest=(MultipartHttpServletRequest)request; Map fileMap=mRequest.getFileMap(); for(MultipartFilemFile:fileMap.values()){ StringfileName=mFile.getOriginalFilename(); result=uploadService.uploadFile(mFile,id); } returnresult; }
四、总结
最后梳理一下流程,服务消费者接收前端(如浏览器)传过来的文件,但是并不进行业务处理,然后通过Feign调用接口,把文件传给服务提供者,服务提供者拿到文件后,进行相应的业务处理。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。