Spring Cloud Feign文件传输的示例代码

网友投稿 252 2023-08-01

Spring Cloud Feign文件传输的示例代码

一、配置文件解析器

服务提供者和消费者都需要配置文件解析器,这里使用 commons-fileupload 替换原有的解析器:

依赖:

commons-fileupload

commons-fileupload

1.3.1

注入 bean :

@Bean(name = "multipartResolver")

public MultipartResolver mutipartResolver(){

CommonsMultipartResolver com = new CommonsMultipartResolver();

com.setDefaultEncoding("utf-8");

return com;

}

程序入口中剔除原有的解析器:

@SpringBootApplication(exclude = {MultipartAutoConfiguration.class})

二、服务提供者,即接收文件一方的配置

Controller 的写法:

@ResponseBody

@RequestMapping(value = "/upload", method = {RequestMethod.POST},

produces = {MediaType.APPLICATION_jsON_UTF8_VALUE},

consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

public Result uploadFile(@RequestPart("file")MultipartFile file,

@RequestParam("id")Long id){

String fileName = file.getOriginalFilename();

String extend = FileOperateUtil.suffix(fileName);

FileOperateUtil.copy("E:\\" + fileName, file);

return ResultBuilder.success("ok");

}

@RequestPart 指定文件,后面的 @RequestParam 是额外参数,注意额外参数不能超过url长度限制。

三、服务消费者配置

依赖:

io.github.openfeign.form

feign-form-spring

3.2.2

io.github.openfeign.form

feign-form

3.2.2

文件编码配置:

import feign.codec.Encoder;

import feign.form.spring.SpringFormEncoder;

import org.springframework.beans.factory.ObjectFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.autoconfigure.web.HttpMessageConverters;

import org.springframework.cloud.netflix.feign.support.SpringEncoder;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annohttp://tation.Configuration;

@Configuration

public class MultipartSupportConfig{

@Autowired

private ObjectFactory messageConverters;

@Bean

public Encoder feignFormEncoder(){

return new SpringFormEncoder(new SpringEncoder(messageConverters));

}

}

Feign 接口定义:

@FeignClient(name = "test-upload")

public interface UploadService{

@ResponseBody

@RequestMapping(value = "/upload", method = {RequestMethod.POST},

produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},

consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

ResultuploadFile(@RequestPart("file")MultipartFile file,

@RequestParam("id")Long id);

}

与普通 Feign 接口写法差不多,注意方法注解和参数与服务提供者的 controller 一样。

Controller 的写法, Controller 中接收前端传过来的文件信息和额外参数,然后通过 Feign 接口传输到远端:

// 注入 feign 接口

@Autowired

private UploadService uploadService;

@RequestMapping(value = "/upload", method = RequestMethod.POST, produces = "application/json; charset=utf-8")

@ResponseBody

public Result testUpload(HttpServletRequest request, Long id){

Result result = null;

MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;

Map fileMap = mRequest.getFileMap();

for (MultipartFile mFile : fileMap.values()) {

String fileName = mFile.getOriginalFilename();

result = uploadService.uploadFile(mFile, id);

}

return result;

}

四、总结

最后梳理一下流程,服务消费者接收前端(如浏览器)传过来的文件,但是并不进行业务处理,然后通过 Feign 调用接口,把文件传给服务提供者,服务提供者拿到文件后,进行相应的业务处理。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解Spring中bean的几种注入方式
下一篇:说说node中的可读流和可写流的区别
相关文章

 发表评论

暂时没有评论,来抢沙发吧~