欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Feign之Multipartfile文件傳輸填坑

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

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

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(文件)的解決

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

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

我看網上有很多使用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;
/**
 * 能力的調用
 *
 * @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()注解

服務端:

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

結果發(fā)現(xiàn),這樣是獲取不到結果的,研究了好一會,因為要著急聯(lián)調,就沒有繼續(xù)跟蹤了,有時間在深入研究下。

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

方法二:使用HttpServletRequest獲取

上述操作都不需要,即:不需要導入依賴,也不需要創(chuàng)建文件,只需要在服務端通過HttpServletRequest去設置

使用HttpServletRequest設置:

偽代碼如下:

    @RequestMapping(value = "/baiduImgAuditByFile", method = RequestMethod.POST)
    public RespUtil baiduImgAuditByFile(MultipartFile file, HttpServletRequest request) {
        if (file == null) {
            // 解決服務間調用無法接受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è)務邏輯
        return null;
    }

主要說明如下圖:

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 淺析Spring工廠的反射和配置文件

    淺析Spring工廠的反射和配置文件

    這篇文章主要介紹了淺析Spring工廠的反射和配置文件,spring是通過反射和配置文件的方式來獲取 JavaBean 對象,需要的朋友可以參考下
    2023-04-04
  • kaptcha驗證碼組件使用簡介解析

    kaptcha驗證碼組件使用簡介解析

    這篇文章主要介紹了kaptcha驗證碼組件使用簡介解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • java數(shù)據(jù)庫連接池的特點及步驟

    java數(shù)據(jù)庫連接池的特點及步驟

    大家好,本篇文章主要講的是數(shù)據(jù)庫連接池的特點及步驟,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 詳解SpringBoot的三種緩存技術(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)

    詳解SpringBoot的三種緩存技術(Spring Cache、Layering Cache 框架、Alibaba J

    這篇文章主要介紹了SpringBoot的三種緩存技術,幫助大家更好的理解和學習springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • Java URL自定義私有網絡協(xié)議

    Java URL自定義私有網絡協(xié)議

    URI與URL的區(qū)別 一.先來序言一段 二.協(xié)議的自定義的理解 三.自定義協(xié)議與URL的關系 四.URL自定義私有協(xié)議實戰(zhàn) 五.后話,自定義mineType解析器
    2016-04-04
  • mybatis中數(shù)據(jù)加密與解密的實現(xiàn)

    mybatis中數(shù)據(jù)加密與解密的實現(xiàn)

    數(shù)據(jù)加解密的實現(xiàn)方式多種多樣,在mybatis環(huán)境中數(shù)據(jù)加解密變得非常簡單易用,本文主要介紹了mybatis中數(shù)據(jù)加密與解密的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • MyBatis-Plus自動化填充的踩坑記錄及解決

    MyBatis-Plus自動化填充的踩坑記錄及解決

    這篇文章主要介紹了MyBatis-Plus自動化填充的踩坑記錄及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 如何使用Resttemplate和Ribbon調用Eureka實現(xiàn)負載均衡

    如何使用Resttemplate和Ribbon調用Eureka實現(xiàn)負載均衡

    這篇文章主要介紹了如何使用Resttemplate和Ribbon調用Eureka實現(xiàn)負載均衡,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中的synchronized關鍵字

    Java中的synchronized關鍵字

    這篇文章主要介紹了Java中的synchronized關鍵字,synchronized可以保證方法或代碼塊在運行時,同一時刻只有一個線程可以進入到臨界區(qū)(互斥性),同時它還保證了共享變量的內存可見性,下面我們就來看看你文章對synchronized鎖的介紹,需要的朋友也可以參考一下
    2021-12-12
  • Servlet實現(xiàn)多文件上傳功能

    Servlet實現(xiàn)多文件上傳功能

    這篇文章主要為大家詳細介紹了Servlet實現(xiàn)文件上傳功能,還可以實現(xiàn)Servlet多文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評論