好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

使用feign传递参数类型为MultipartFile的问题

feign传递参数类型为MultipartFile

feign默认是不支持多媒体文件类型的文件传输的,但是可以通过引入第三方jar包解决这个问题,步骤可以分为三步。

引入maven依赖

?

1

2

3

4

5

6

7

8

9

10

         < dependency >

            < groupId >io.github.openfeign.form</ groupId >

            < artifactId >feign-form</ artifactId >

            < version >3.3.0</ version >

        </ dependency >

        < dependency >

            < groupId >io.github.openfeign.form</ groupId >

            < artifactId >feign-form-spring</ artifactId >

            < version >3.3.0</ version >

        </ dependency >

加入配置类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

@Configuration

public class FeignMultipartSupportConfig {

 

    @Bean

    @Primary

    @Scope ( "prototype" )

    public Encoder multipartFormEncoder() {

        return new SpringFormEncoder();

    }

 

    @Bean

    public feign.Logger.Level multipartLoggerLevel() {

        return feign.Logger.Level.FULL;

    }

}

在feign客户端进行配置

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.http.MediaType;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RequestPart;

import org.springframework.web.multipart.MultipartFile;

import config.FeignMultipartSupportConfig;

import feign.Response;

@FeignClient (value = "" , fallback = FileServiceFallback. class ,configuration=FeignMultipartSupportConfig. class )

public interface IFileService {

     //上传文件

     @RequestMapping (value = "/rmi/fileService/mediaImgUpload" ,  produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

     public String mediaImgUpload( @RequestPart MultipartFile file);

     //下载文件

     @RequestMapping (value = "/rmi/fileService/mediaDownload" ,method = RequestMethod.GET,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)

     public Response mediaDownload( @RequestParam (required = true ) String mediaId);

feign传参MultipartFile问题解决

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

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

首先引入依赖

?

1

2

3

4

5

6

7

8

9

10

11

< 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的配置

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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接口中配置

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

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);

}

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

就可以传参了的

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

原文链接:https://blog.csdn.net/qq_43603116/article/details/93304319

查看更多关于使用feign传递参数类型为MultipartFile的问题的详细内容...

  阅读:11次