您好,登錄后才能下訂單哦!
這篇文章主要介紹如何解決使用feign傳遞參數類型為MultipartFile的問題,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
feign默認是不支持多媒體文件類型的文件傳輸的,但是可以通過引入第三方jar包解決這個問題,步驟可以分為三步。
<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>
@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; } }
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服務之間的調用,傳參默認的格式為: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,否則還是無效的
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)); } }
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的問題”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。