基于feign傳參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); }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
關于SpringMVC在Controller層方法的參數解析詳解
在SpringMVC中,控制器Controller負責處理由DispatcherServlet分發(fā)的請求,下面這篇文章主要給大家介紹了關于SpringMVC在Controller層方法的參數解析的相關資料,需要的朋友可以參考下2021-12-12java中String StringBuffer和StringBuilder的區(qū)別詳解
大家好,本篇文章主要講的是java中String StringBuffer和StringBuilder的區(qū)別詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01Hibernate基于ThreadLocal管理Session過程解析
這篇文章主要介紹了Hibernate基于ThreadLocal管理Session過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10