好得很程序员自学网

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

基于feign传参MultipartFile问题解决

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

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

49

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

?

1

2

3

4

5

6

<!-- https://mvnrepository测试数据/artifact/org.springframework/spring-mock -->

< dependency >

< groupId >org.springframework</ groupId >

< artifactId >spring-mock</ artifactId >

< version >2.0.8</ version >

</ dependency >

?

1

2

3

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

?

1

2

@PostMapping (value = "/upload" , consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

ResultBody upload( @RequestPart (value = "file" ) MultipartFile file);

报错 Required request part ‘file’ is not present

configuration

?

1

2

3

4

5

6

7

8

9

10

11

12

@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

?

1

2

3

4

5

6

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

}

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

原文链接:https://blog.csdn.net/qq_42151769/article/details/106753475

查看更多关于基于feign传参MultipartFile问题解决的详细内容...

  阅读:24次