`
狂盗一枝梅
  • 浏览: 17931 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

使用Feign接口实现文件上传的解决方案

 
阅读更多
原文链接:[使用Feign接口实现文件上传的解决方案](https://blog.kdyzm.cn/post/176)

一般的情况下,后端有个微服务,暴露出一个文件上传的restful接口给前端,前端调用该接口获取上传后的链接以及oss key值完成上传。假设提供restful接口的这个服务叫做A,现在有个微服务B有个本地文件,需要将本地文件调用A文件文件上传接口上传到文件服务器,该如何做?

一般情况下,一个文件上传的restful接口如下所示:

``` java
@PostMapping("/upload")
public WrapperResult<UploadResult> uploadFile(@RequestParam("file") MultipartFile multipartFile){
    ......
}
```

那对应的Feign接口就如下所示

``` java
@PostMapping("/upload")
public WrapperResult<UploadResult> uploadFile(@RequestParam("file") MultipartFile multipartFile);
```

从直觉上来看,直接调用八成会出问题(笑),通过踩坑,我梳理了下后端调用Feign接口实现文件上传的改造点



### 1. 接口修改

一般的文件上传接口定义:

``` java
@PostMapping("/upload")
public WrapperResult<UploadResult> uploadFile(@RequestParam("file") MultipartFile multipartFile){
    ......
}
```

在Feign接口暴露出来的情况下,则不能再使用@RequestParam注解,应当使用@RequestPart注解,另外需要指定consumes类型为表单类型,否则会翻车。

修改后的接口如下

``` java
@PostMapping(
    value = {"/upload"},
    consumes = {"multipart/form-data"}
)
UploadResult uploadFile(@RequestPart("file") @NotNull MultipartFile multipartFile);
```

这里注意两点:

1. 使用@RequestPart注解替换掉@RequestParam注解
2. 指定consumes类型为表单类型



### 2. Encoder修改

在springboot中,一般的Encoder定义如下

``` java
@Bean
@Primary
public Encoder feignEncoder() {
    HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(
            JsonUtils.getObjectMapper()
    );
    ObjectFactory<HttpMessageConverters> objectFactory =
            () -> new HttpMessageConverters(jacksonConverter);
    return new SpringEncoder(objectFactory);
}
```

返回了一个SpringEncoder对象,这里需要返回一个SpringFormEncoder对象以支持Feign接口的表单功能,只需要将new SpringEncoder(objectFactory)修改为new SpringFormEncoder(new SpringEncoder(objectFactory))即可,修改后的代码如下

``` java
@Bean
@Primary
public Encoder feignEncoder() {
    HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(
            JsonUtils.getObjectMapper()
    );
    ObjectFactory<HttpMessageConverters> objectFactory =
            () -> new HttpMessageConverters(jacksonConverter);
    return new SpringFormEncoder(new SpringEncoder(objectFactory));
}
```



### 3. 客户端调用修改

现在Feign接口长这个样子

``` java
@PostMapping(
    value = {"/upload"},
    consumes = {"multipart/form-data"}
)
UploadResult uploadFile(@RequestPart("file") @NotNull MultipartFile multipartFile);
```

那我们Feign接口调用的时候就得构造MultipartFile对象,这里需要引入spring-test的依赖

``` xml
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
</dependency>
```

然后代码这么写

``` java
FileInputStream fis = null;
try {
    Tika tika = new Tika();
    String mimeType = tika.detect(file);
    fis = new FileInputStream(file);
    MockMultipartFile mockMultipartFile = new MockMultipartFile(
            "file",
            file.getName(),
            mimeType,
            fis
    );

    UploadResult uploadResult = ossPublicApi.uploadFile(mockMultipartFile);
}catch(Exception e){
    ......
}
```

这里为了告知正确的媒体类型,引入了tika,关于tika,参考文章 [使用tika获取文件的实际类型](https://blog.kdyzm.cn/post/174) 引入

需要注意以下几点

1. 需要引入spring-test,注意scope默认就行,不能为provided
2. 需要引入tika,告知正确的媒体类型,否则上传到minio等文件服务器,在浏览器中打开图片、mp4视频等文件本来应当在浏览器打开的文件会变成自动下载



END.



分享到:
评论

相关推荐

    使用Feign实现微服务间文件传输

    使用Feign调用FileUpload接口可以轻松地实现文件上传功能。 使用Feign实现微服务间文件传输可以提供简洁、灵活的文件传输方式,解决了文件传输过程中的问题。但是,需要注意在文件传输过程中的安全问题,使用SSL/...

    使用Spring Cloud Feign上传文件的示例

    本篇文章主要介绍了使用Spring Cloud Feign上传文件的示例,通过配置Feign Client和Encoder实现文件上传。下面是相关知识点的详细解释: 一、Feign Client配置 在使用Spring Cloud Feign上传文件时,需要配置Feign...

    糞坑-SpringCloud中使用Feign的坑

    本文将深入探讨在SpringCloud中使用Feign时可能出现的问题,并提供解决方案。 首先,我们来理解Feign的工作原理。Feign是基于Java的注解和HTTP的客户端,它可以创建一个接口并将其动态地实现为HTTP客户端。通过在...

    java--curl工具,用于生成curl链接,直接在服务器上使用

    `Curl`注解通常定义在Feign接口的方法上,当这个方法被调用时,`CurlAspect`切面会捕获请求的相关信息,如HTTP方法(GET, POST等)、URL、请求头和请求体,然后构建并输出对应的curl命令。这样,开发者可以直接在...

    基于springboot实现的分布式网盘系统.zip

    5. **文件存储**:分布式网盘系统需考虑文件的分布式存储,可能采用了如Hadoop HDFS、FastDFS或者阿里云OSS等解决方案,以实现高可用和扩展性。 6. **权限控制**:Spring Security或Apache Shiro可以用于实现系统的...

    服务与服务之间的连接.zip

    在Java世界中,Spring Cloud提供了一套完整的解决方案,包括Feign客户端(声明式HTTP客户端)和 Ribbon(客户端负载均衡器),使得服务间调用更加简单。在`provider-demo`项目中,可能包含了服务提供者的实现,它...

    springcloud及其相关配置

    SpringCloud并没有提供专门的文件上传解决方案,但可以通过集成如Spring Boot的MultipartFile处理文件上传,结合云存储服务如阿里云OSS或AWS S3实现分布式文件系统。 以上就是SpringCloud框架中的关键组件及其功能...

    基于SpringCloud分布式微服务+微信小程序实现短视频社交app设计源码.zip

    首先,SpringCloud是微服务开发的主流框架,它提供了包括服务注册与发现、熔断机制、配置中心等一整套解决方案。Eureka作为服务注册与发现的组件,负责管理各个微服务实例,使得服务间的通信变得更加简单。而Zuul...

    springcloud

    在IT行业中,Spring Cloud是一个广泛使用的微服务框架,它提供了构建分布式系统所需的工具和服务发现、配置中心、断路器、智能路由、...这是一套完整的微服务架构解决方案,旨在提高系统的可伸缩性、可靠性和可维护性。

    Spring Cloud Netflix【spring cloud中文版】--spring cloud中文文档.pdf

    文件结尾部分提到了如何通过Zuul上传文件,以及如何实现简单的嵌入式Zuul。此外,还讨论了如何禁用Zuul的过滤器,通过Sidecar进行多语言支持,以及如何将RxJava与Spring MVC集成。最后,文档提到了指标相关的...

    Spring Cloud(Dalston )中文参考手册

    - **通过Zuul上传文件**:说明如何通过Zuul上传文件。 - **查询字符串编码**:讲解如何处理URL中的查询字符串。 - **普通嵌入Zuul**:介绍如何将Zuul作为普通组件嵌入到应用程序中。 - **禁用Zuul过滤器**:说明...

    Spring Cloud 中文文档 参考手册 中文版2018

    总的来说,Spring Cloud Dalston文档涉及了Spring Cloud核心组件的配置和使用方法,这些组件为云原生应用程序提供了一系列分布式系统开发的解决方案。开发者可以根据文档的内容快速开始使用Spring Cloud,构建微服务...

    spring cloud 中文文档

    - **通过Zuul上传文件**:提供了关于如何通过Zuul网关上传文件的具体指导。 - **查询字符串编码**:讨论了如何处理URL中的查询字符串编码问题。 - **普通嵌入Zuul**:解释了如何在非Spring Boot项目中嵌入Zuul。 ##...

    spring cloud中文文档

    从文档中可见,Spring Cloud围绕一系列核心项目展开,每个项目针对微服务架构中的一项特定需求提供解决方案,比如服务发现、配置管理、负载均衡、断路器、消息总线等。这些知识点构成了Spring Cloud微服务架构的关键...

    随缘亲情奉献 Spring Cloud Dalston 中文文档 参考手册 中文版

    **Spring Cloud** 是一套微服务解决方案工具包,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发。**Spring Cloud Dalston** 是Spring Cloud的一个重要版本,提供了众多新特性和改进,旨在帮助...

    springcloud电商项目

    综上所述,“Spring Cloud 电商项目”是一个涵盖了多种现代微服务技术的综合案例,它不仅展示了Spring Cloud生态的强大功能,同时也为开发者提供了实际应用场景中的技术解决方案和技术选型参考。对于想要深入了解...

    2024 Java面试宝典合集

    5. **SpringCloud面试题**:Spring Cloud为微服务提供了一整套解决方案,面试可能涉及Eureka服务发现、Zuul和Gateway网关、Ribbon客户端负载均衡、Hystrix熔断器、Feign声明式HTTP客户端、Spring Cloud Config配置...

Global site tag (gtag.js) - Google Analytics