最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Feign之Multipartfile文件傳輸填坑

 更新時(shí)間:2021年06月30日 12:00:46   作者:愛折騰的Albert  
這篇文章主要介紹了Feign之Multipartfile文件傳輸埋坑及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Multipartfile文件傳輸

1. 添加依賴

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

2. 添加配置類

@Configuration
public class FeignMultipartConfig {
    @Bean
    @Primary
    @Scope("prototype")
    public SpringFormEncoder multipartFormEncoder() {
        return new SpringFormEncoder();
    }
    @Bean
    public feign.Logger.Level multipartLoggerLevel() {
        return feign.Logger.Level.FULL;
    }
}

3. 接口編寫

@FeignClient使用配置類

@PostMapping設(shè)置

consumes = MediaType.MULTIPART_FORM_DATA_VALUE

使用@RequestPart(),不能使用@RequestParam()

@FeignClient(value = "face-service",configuration = FeignMultipartConfig.class)
public interface FaceClient {
 @PostMapping(value = "/search/student", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    ResponseBase<SearchStudentFaceVO> searchStudentFace(@RequestPart("file") MultipartFile file);
}

feign不能正常傳遞參數(shù)MultipartFile(文件)的解決

之前工作中有個(gè)業(yè)務(wù)場景:需要把文件以MultipartFile進(jìn)行服務(wù)之間的調(diào)用(使用的是Feign),特此記錄下踩到的坑

需要注意的是:使用默認(rèn)的springcloud自帶的spring-cloud-starter-openfeign是不支持傳遞文件的。

我看網(wǎng)上有很多使用feign-form和feign-form-spring支持的jar包,然后配置SpringFormEncoder,但我試了,沒有成功,最后使用了另外一種方法,在此記錄下吧:

方法一:使用外部依賴

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

新建配置類:

package com.jsyd.ict.ictservicemanager.configuration;
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 feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.context.annotation.Configuration;
/**
 * 處制定了注入的feignFormEncoder可以覆蓋掉原本的encoder
 * 該方式可以讓發(fā)送multipartFile成為可能
 * @author wangyang
 * @version 1.0
 * @date 2021/4/13 19:13
 */
@Configuration
public class MultipartSupportConfig {
    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;
    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(messageConverters));
    }
}

配置feign接口:

package com.jsyd.ict.ictservicemanager.feign;
import com.jsyd.ict.ictservicemanager.util.resp.RespUtil;
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.io.BufferedInputStream;
import java.io.File;
import java.io.InputStream;
/**
 * 能力的調(diào)用
 *
 * @author wangyang
 * @version 1.0
 * @date 2021/3/11 21:01
 */
@FeignClient(name = "ict-service-capacity", configuration = MultipartSupportConfig.class)
public interface CapacityFeign {
    @RequestMapping(value = "contentAudit/baiduImgAuditByFile", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    RespUtil baiduImgAuditByFile(@RequestPart(value = "file") MultipartFile file);
}

注意:文件的傳輸需要使用@RequestPart()注解

服務(wù)端:

    @RequestMapping(value = "/baiduImgAuditByFile", method = RequestMethod.POST)
    public RespUtil baiduImgAuditByFile(@RequestParam("file") MultipartFile file)  {
  // 調(diào)用service
        return null;
    }

結(jié)果發(fā)現(xiàn),這樣是獲取不到結(jié)果的,研究了好一會(huì),因?yàn)橐甭?lián)調(diào),就沒有繼續(xù)跟蹤了,有時(shí)間在深入研究下。

后來使用了下面的方法,成功傳參

方法二:使用HttpServletRequest獲取

上述操作都不需要,即:不需要導(dǎo)入依賴,也不需要?jiǎng)?chuàng)建文件,只需要在服務(wù)端通過HttpServletRequest去設(shè)置

使用HttpServletRequest設(shè)置:

偽代碼如下:

    @RequestMapping(value = "/baiduImgAuditByFile", method = RequestMethod.POST)
    public RespUtil baiduImgAuditByFile(MultipartFile file, HttpServletRequest request) {
        if (file == null) {
            // 解決服務(wù)間調(diào)用無法接受MultipartFile參數(shù)的問題
            String contentType = request.getContentType();
            if (contentType != null && contentType.toLowerCase().startsWith("multipart/")) {
                MultipartHttpServletRequest multipartRequest =
                        WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
                if (multipartRequest != null) {
                    MultiValueMap<String, MultipartFile> multiFileMap = multipartRequest.getMultiFileMap();
                    for (Map.Entry<String, List<MultipartFile>> entry : multiFileMap.entrySet()) {
                        file = entry.getValue().get(0);
                    }
                }
            }
        }
        // 處理業(yè)務(wù)邏輯
        return null;
    }

主要說明如下圖:

即通過HttpServletRequest 的方式即使文件獲取不到,也可以進(jìn)行特殊處理,從而獲取文件。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入講解Java 9中的九個(gè)新特性

    深入講解Java 9中的九個(gè)新特性

    Java 8 發(fā)布三年多之后,即將快到2017年7月下一個(gè)版本發(fā)布的日期了。 你可能已經(jīng)聽說過 Java 9 的模塊系統(tǒng),但是這個(gè)新版本還有許多其它的更新。 這里有九個(gè)令人興奮的新功能將與 Java 9 一起發(fā)布。需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-05-05
  • Java中LocalDate日期格式轉(zhuǎn)換(使用系統(tǒng)時(shí)區(qū))

    Java中LocalDate日期格式轉(zhuǎn)換(使用系統(tǒng)時(shí)區(qū))

    本文主要介紹了Java中LocalDate日期格式轉(zhuǎn)換(使用系統(tǒng)時(shí)區(qū)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2007-02-02
  • Spring?Boot循環(huán)依賴原理、解決方案與最佳實(shí)踐(全解析)

    Spring?Boot循環(huán)依賴原理、解決方案與最佳實(shí)踐(全解析)

    循環(huán)依賴指兩個(gè)或多個(gè)Bean相互直接或間接引用,形成閉環(huán)依賴關(guān)系,這篇文章主要介紹了Spring?Boot循環(huán)依賴原理、解決方案與最佳實(shí)踐(全解析),需要的朋友可以參考下
    2025-04-04
  • Java版微信公眾號(hào)支付開發(fā)全過程

    Java版微信公眾號(hào)支付開發(fā)全過程

    這篇文章主要介紹了Java版微信公眾號(hào)支付開發(fā)全過程,本文通過實(shí)例相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • 怎樣將一個(gè)JAR包添加到Java應(yīng)用程序的Boot?Classpath中

    怎樣將一個(gè)JAR包添加到Java應(yīng)用程序的Boot?Classpath中

    本文文章給大家介紹如何將一個(gè)JAR包添加到Java應(yīng)用程序的Boot?Classpath中,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的的朋友參考下吧
    2023-11-11
  • idea快速生成代碼配置的方法示例

    idea快速生成代碼配置的方法示例

    本文主要介紹了idea快速生成代碼配置的方法示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Spring高級(jí)接口Aware淺析

    Spring高級(jí)接口Aware淺析

    通過aware接口可以獲取Spring容器相關(guān)信息,但這樣會(huì)與Spring容器耦合,這篇文章主要介紹了Spring aware接口理解,需要的朋友可以參考下
    2023-01-01
  • 關(guān)于swagger配置及踩坑@Api參數(shù)postion無效解決接口排序問題

    關(guān)于swagger配置及踩坑@Api參數(shù)postion無效解決接口排序問題

    這篇文章主要介紹了關(guān)于swagger配置及踩坑@Api參數(shù)postion無效解決接口排序問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java壓縮文件操作詳解

    Java壓縮文件操作詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言進(jìn)行壓縮文件操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • Java中的Phaser并發(fā)階段器詳解

    Java中的Phaser并發(fā)階段器詳解

    這篇文章主要介紹了Java中的Phaser并發(fā)階段器詳解,Phaser由JDK1.7提出,是一個(gè)復(fù)雜強(qiáng)大的同步輔助類,是對同步工具類CountDownLatch和CyclicBarrier的綜合升級(jí),能夠支持分階段實(shí)現(xiàn)等待的業(yè)務(wù)場景,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

木里| 拜泉县| 益阳市| 长宁县| 介休市| 萨嘎县| 盱眙县| 保山市| 时尚| 青海省| 吉木乃县| 进贤县| 嘉义县| 拜泉县| 定州市| 古丈县| 阿城市| 株洲县| 怀宁县| 朔州市| 徐水县| 孝昌县| 陈巴尔虎旗| 西安市| 沈丘县| 余江县| 铁岭县| 腾冲县| 黄浦区| 景宁| 吴堡县| 晋江市| 山东| 辽阳县| 上高县| 桂阳县| 柳州市| 金塔县| 定兴县| 荃湾区| 涿鹿县|