基于feign传参MultipartFile问题解决

目录
  • feign传参MultipartFile问题
    • 首先引入依赖
    • 新建feign的配置
    • 在feign接口中配置
  • Feign传输MultipartFile的一些问题
    • File转MultipartFile

feign传参MultipartFile问题

首先,feign服务之间的调用,传参默认的格式为:ContentType=application/x-www-form-urlencoded

以表单的形式传参的,而文件流的传参,需要form-data的ContentType,否则会报错的

首先引入依赖

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

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

注意spring boot版本是2.x以上的,上面两个依赖的版本不低于3.5.0,否则还是无效的

新建feign的配置

package com.wm.blog_config.config;
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.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; 

/**
 * @author :半卷流年
 * @description : 解决feign传递流数据的异常
 * @createTime :2020/6/14
 */
@Configuration
public class FeignSupportConfig {
    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(messageConverters));
    }
}

在feign接口中配置

package com.wm.blog_admin.feign;
import com.wm.blog_admin.feign.factory.PictureClientFallbackFactory;
import com.wm.blog_common.constatnt.CommonConstant;
import com.wm.blog_common.domain.TFileDO;
import com.wm.blog_common.entity.TFile;
import com.wm.blog_common.req.TFileQuery;
import com.wm.blog_common.result.Result;
import com.wm.blog_config.config.CustomFeignConfig;
import com.wm.blog_config.config.FeignSupportConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;

/***
 * @ClassName: PictureFeignClient
 * @Description: picture feign调用  todo feign使用get有坑啊,是否考虑使用HttpClient替换feign的HttpURLConnection,采用apache的HttpClient
 * @Author: wm_yu
 * @Create_time: 16:39 2020-3-26
 */
@FeignClient(value = CommonConstant.PICTURE_MODULE_NAME, configuration = {CustomFeignConfig.class, FeignSupportConfig.class}, fallbackFactory = PictureClientFallbackFactory.class)
public interface PictureFeignClient {

    /**
     * id查询图片信息
     * @param id
     * @return
     */
    @GetMapping("/web/picture/{id}")
    Result<TFileDO> get(@PathVariable("id") Long id); 

    /**
     * id批量查询图片信息
     * @param idList
     * @return
     */
    @PostMapping("/web/picture/getByIdList")
    Result<List<TFile>> getByIdList(@RequestBody List<Long> idList); 

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping(value = "/web/picture/uploadFile",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     Result<String> uploadFile(@RequestPart("file") MultipartFile file);

}

注意加上这个,表示传参格式:

就可以传参了的

Feign传输 MultipartFile的一些问题

File转MultipartFile

pom.xml

<!-- https://mvnrepository.com/artifact/org.springframework/spring-mock -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-mock</artifactId>
<version>2.0.8</version>
</dependency>
public static MultipartFile getMultipartFile(String fileName, File file) throws IOException {
    return new MockMultipartFile(fileName, file.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), new FileInputStream(file));
}

报错 Current request is not a multipart request、Content type ‘’ not supported

@PostMapping设置 consumes = MediaType.MULTIPART_FORM_DATA_VALUE

使用@RequestPart(),不能使用@RequestParam()

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResultBody upload(@RequestPart(value = "file") MultipartFile file);

报错 Required request part ‘file’ is not present

configuration

@Configuration
public class UploadFeignConfig {
    @Bean
    public Encoder multipartFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(new ObjectFactory<HttpMessageConverters>() {
            @Override
            public HttpMessageConverters getObject() throws BeansException {
                return new HttpMessageConverters(new RestTemplate().getMessageConverters());
            }
        }));
    }
}

FeignClient

@FeignClient(value = FileConstants.FILE_SERVER, configuration= UploadFeignConfig.class)
public interface FileServiceClient extends IFileServiceClient {
    @Override
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    ResultBody upload(@RequestPart(value = "file") MultipartFile file);
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Feign之Multipartfile文件传输填坑

    Multipartfile文件传输 1. 添加依赖 <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>io.github.openf

  • 解决springboot MultipartFile文件上传遇到的问题

    1.ajax传过去的参数在controller接受不到 解决:在contoller中增加@RequestParam 例如:saveUploadFile( @RequestParam("file") MultipartFile file,HttpServletRequest request) 2.org.springframework.web.multipart.support.MissingServletRequestPartException: Required request pa

  • 关于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服务传输的问题

    大家好,因为近期做需求中遇到了文件上传这个东西,而且我这个还是跨服务去传输文件的所以我这边使用了httpclient和RestTemplate去做,但是最后还是用的httpclient.feign和RestTemplate在超大文件下会OOM所以适用于小文件传输我这边测试的在1G以下.httpclient好像是无限哈哈哈.(具体多少大家有时间可以去测一下) 1.被调用服务的Controller 1.这块使用@RequestParam("file")或者@RequestPart(&quo

  • 基于feign传参MultipartFile问题解决

    目录 feign传参MultipartFile问题 首先引入依赖 新建feign的配置 在feign接口中配置 Feign传输MultipartFile的一些问题 File转MultipartFile feign传参MultipartFile问题 首先,feign服务之间的调用,传参默认的格式为:ContentType=application/x-www-form-urlencoded 以表单的形式传参的,而文件流的传参,需要form-data的ContentType,否则会报错的 首先引入依赖

  • 解决SpringCloud Feign异步调用传参问题

    背景 各个子系统之间通过feign调用,每个服务提供方需要验证每个请求header里的token. public void invokeFeign() throws Exception { feignService1.method(); feignService2.method(); feignService3.method(); .... } 定义拦截每次发送feign调用拦截器RequestInterceptor的子类,每次发送feign请求前将token带入请求头 @Configurati

  • Springcloud feign传日期类型参数报错的解决方案

    目录 feign传日期类型参数报错 Date类型参数报错 LocalDate类型报错 feign传参问题及传输Date类型参数时差的坑 下面说说两种解决方案 feign传参时候使用@DateTimeFormat注解的坑 feign传日期类型参数报错 Date类型参数报错 在Spring cloud feign接口中传递Date类型参数时报错,报错信息. 场景: 客户端传递一个new Date()的参数,服务端接受的参数和客户端有时间差. 客户端打印格式化的new Date(): 2018-05-

  • feign GET请求不支持对象传参的坑及解决

    目录 GET请求不支持对象传参 问题 解决方法 feign发get请求遇到的坑 问题 原因分析 加上@RequestParam后问题解决 GET请求不支持对象传参 问题 @GetMapping("/getByParam") String hello(Student student) throws Exception; 如上,feign调用报错500. 解决方法 增加@SpringQueryMap @GetMapping("/getByParam") String h

  • 基于vue cli 通过命令行传参实现多环境配置

    大多数项目都有生产环境和开发环境,一般情况下应该够了,但是有时候还需要sit,uat,本地等环境,这时候假如要通过注释的方式切换环境就相当麻烦了. 如果可以像下面这样切换环境就方便了 npm run serve //默认本地开发环境 npm run serve -sit //本地开发中使用sit环境 npm run serve -uat //本地开发中使用uat环境 npm run build //默认打包后使用生产环境 npm run build -local //打包后使用本地环境 npm

  • 基于Django URL传参 FORM表单传数据 get post的用法实例

    POST和GET是web开发中常用的表单交互方法,是构建web前后端交互系统的顶梁柱,现将Django中的简单用法示例记录下来,以供后续查询和其他同学参考 1.URL传参 #前端html的链接中用模版标签把参数"x"传递给achievement这个应用的yearcontent方法 <td><a href={% url 'achievement:yearcontent' x %} >{{ x }}</a></td> #urls.py中用正则

  • SpringCloud:feign对象传参和普通传参及遇到的坑解决

    目录 feign对象传参和普通传参及遇到的坑 对象传参 普通传参 遇到的坑-1 遇到的坑-2 feign传递复杂参数对象需要注意的地方 传递复杂参数对象需要用Post 在传递的过程中 feign对象传参和普通传参及遇到的坑 对象传参 使用@RequestBody来指定传参对象 @RequestMapping(value = "/v2/matterCode/genCode", method = RequestMethod.POST)     ResultResponse<Strin

  • 关于Feign调用服务Headers传参问题

    目录 Feign调用服务Headers传参 我们可以使用RequestInterceptor来实现 Feign设置Header头部,@Headers无效 于是开启feign的日志 于是debug调试 Feign调用服务Headers传参 在使用springcloud中经常会出现个服务调用,一般情况下会在Headers加上token的验证,那么在feign调用时候我们怎么去传这个token过去呢,有人会用@Headers这个注解来实现.但是这样方法太多笨重. 我们可以使用RequestInterc

  • 使用feign客户端传参接收不到的问题及解决

    目录 feign客户端传参接收不到 先来说一下流程 我们来看下代码 如何解决 feign传递参数!坑! feign客户端传参接收不到 使用feign客户端做不用服务之间的调用的时候出现了provider获取不到参数的问题,在此记录一下. 先来说一下流程 在我的微服务中,有这么几个角色,consumer: 服务的消费者,provider:服务的消费者,还有一个feign,主要就是provider的接口形式,然后consumer依赖了feign,去调用provider中的服务,我在provider中

  • Feign调用中的两种Header传参方式小结

    目录 Feign调用中的两种Header传参方式 在请求拦截器中统一配置 通过@RequestHeader注解 调用feign接口时,如何往header中添加参数 总结 Feign调用中的两种Header传参方式 在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端. 我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client, Spri

随机推荐