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.com/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