Feign实现跨服务文件上传下载

 更新时间:2019年04月26日 10:03:35   作者:浪里xiao白龙  
这篇文章主要为大家详细介绍了Feign实现跨服务文件上传下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Feign实现跨服务的文件上传下载操作,供大家参考,具体内容如下

1、跨服务文件上传,目前feign不支持调用文件上传接口,需要自行配置来满足feign的调用方式

①.首先需要在pom文件里添加feign依赖

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

②.上传的接口

@FeignClient(value = "fdn-storage", configuration = {FileFeignConfig.class})
public interface FileClient {

 String PREFIX_PATH = "/oss/files";
 /**
  * 上传存储文件
  * @param file
  * @return
  * @throws IOException
  */
 @PostMapping(value = PREFIX_PATH + "/", consumes = MULTIPART_FORM_DATA_VALUE)
 FeignResult<FileEntity> save(@RequestPart(value = "file") MultipartFile file) throws IOException;
 }

③.添加配置来满足feign的调用

@Configuration
public class FileFeignConfig {
 @Autowired
 private ObjectFactory<HttpMessageConverters> messageConverters;

 @Bean
 @Primary
 @Scope("prototype")
 public Encoder feignEncoder() {
  return new SpringFormEncoder(new SpringEncoder(messageConverters));
 }

 @Bean
 public feign.Logger.Level multipartLoggerLevel() {
  return feign.Logger.Level.FULL;
 }
}

④.外部服务的controller层调用

public class TestController extends BaseRestController {
 @Autowired
 FileClient client;
 /**
  * 上传文件
  **/
 @PostMapping(value = "/" , consumes = MULTIPART_FORM_DATA_VALUE)
 public FileEntity save(@RequestPart(value = "file") MultipartFile file) throws IOException {
  FileEntity fileEntity = client.save(file).getData();
  return fileEntity;
 }
} 

到此位置就可以上传成功了

2、跨服务的文件下载

①.下载的接口(也是写在public interface FileClient),是用feign.Response来作为返回值的

/**
  * 下载文件
  * @param id
  * @return
  * @throws IOException
  */
 @GetMapping(value = PREFIX_PATH + "/{id}/data")
 Response download(@PathVariable("id") String id) throws IOException;

②.外部服务的controller层调用

 /**
  *由id下载存储的文件
  */
 @GetMapping(value = "/{id}/data")
 public void downloadFile(@PathVariable String id, HttpServletResponse servletResponse) throws IOException {
  Response response = client.download(id);
  Response.Body body = response.body();
  for(Object key : response.headers().keySet()){
   List<String> kList = (List)response.headers().get(key);
   for(String val : kList){
    servletResponse.setHeader(StringUtils.toString(key), val);
   }
  }
  try(InputStream inputStream = body.asInputStream();
   OutputStream outputStream = servletResponse.getOutputStream()
  ){
   byte[] b = new byte[inputStream.available()];
   inputStream.read(b);
   outputStream.write(b);
   outputStream.flush();
  }catch (IOException e){
   throw new RestException("IO流异常", e);
  }
 }

至此,下载文件完成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring MVC内置过滤器功能示例详解

    Spring MVC内置过滤器功能示例详解

    这篇文章主要为大家介绍了Spring MVC内置过滤器使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • springboot整合Quartz实现动态配置定时任务的方法

    springboot整合Quartz实现动态配置定时任务的方法

    本篇文章主要介绍了springboot整合Quartz实现动态配置定时任务的方法,非常具有实用价值,需要的朋友可以参考下
    2017-10-10
  • Java中的共享锁CountDownLatch及源码解析

    Java中的共享锁CountDownLatch及源码解析

    这篇文章主要介绍了Java中的共享锁CountDownLatch及源码解析,CountDownLatch是一种同步辅助工具,允许一个或多个线程等待,直到在其它线程中执行的一组操作完成;CountDownLatch使用指定的计数初始化,需要的朋友可以参考下
    2023-11-11
  • java中的FileInputStream(输入流)

    java中的FileInputStream(输入流)

    这篇文章主要介绍了java中的FileInputStream(输入流),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • idea maven编译报错Java heap space的解决方法

    idea maven编译报错Java heap space的解决方法

    这篇文章主要为大家详细介绍了idea maven编译报错Java heap space的相关解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • java实现最短路径算法之Dijkstra算法

    java实现最短路径算法之Dijkstra算法

    这篇文章主要介绍了java实现最短路径算法之Dijkstra算法, Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法,有兴趣的可以了解一下
    2017-10-10
  • Java对象集合按照指定元素顺序排序的实现

    Java对象集合按照指定元素顺序排序的实现

    最近在对一个集合列表的数据进行排序,需求是要集合数据按照一个排序状态值进行排序,而这个状态值,不是按照从小到大这样的顺序排序的,而是要按照特定的顺序,所以本文给大家介绍了Java对象集合按照指定元素顺序排序的实现,需要的朋友可以参考下
    2024-07-07
  • SpringBoot集成redis与session实现分布式单点登录

    SpringBoot集成redis与session实现分布式单点登录

    这篇文章主要介绍了SpringBoot集成redis与session实现分布式单点登录,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Fastjson反序列化随机性失败示例详解

    Fastjson反序列化随机性失败示例详解

    这篇文章主要为大家介绍了Fastjson反序列化随机性失败示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Spring实现跨域的几种方式小结

    Spring实现跨域的几种方式小结

    这篇文章主要给大家总结了几种Spring实现跨域的方式,文中通过代码示例介绍的非常详细,对我们的学习活工作有一定的帮助,需要的朋友可以参考下
    2023-07-07

最新评论