Feign實現微服務間文件上傳


在Spring Cloud 的Feign組件中並不支持文件的傳輸,會出現這樣的錯誤提示:

feign.codec.EncodeException: class [Lorg.springframework.web.multipart.MultipartFile; is not a type supported by this encoder.
    at feign.codec.Encoder$Default.encode(Encoder.java:90) ~[feign-core-9.5.1.jar:na]
    at feign.form.FormEncoder.encode(FormEncoder.java:87) ~[feign-form-3.3.0.jar:3.3.0]
    at feign.form.spring.SpringFormEncoder.encode(SpringFormEncoder.java:64) ~[feign-form-spring-3.3.0.jar:3.3.0]

但是我們可以通過使用Feign的擴展包實現這個功能。

 

一. 示例介紹

服務名 端口號 角色
feign_upload_first 8100 feign服務提供者
feign_upload_second 8101 feign服務消費者

 

 

 

 

我們調用feign_upload_second的上傳文件接口上傳文件,feign_upload_second內部使用feign調用feign_upload_first實現文件上傳。

二 、單文件上傳

2.1 feign_upload_first服務提供者

文件上傳的服務提供者接口比較簡單,如下所示:


@SpringBootApplication
public class FeignUploadFirstApplication {
  @RestController
  public class UploadController {
    
    @RequestMapping(value = "/uploadFile",method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) {
      return file.getOriginalFilename();
    }
  }
  public static void main(String[] args) {
    SpringApplication.run(FeignUploadFirstApplication.class, args);
  }
}

2.2 feign_upload_second服務消費者

  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>
        <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.3</version>
        </dependency>
  2. 新增feign實現文件上傳的配置類
    import feign.codec.Encoder;
    import feign.form.spring.SpringFormEncoder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class FeignSupportConfig {
      @Bean
      public Encoder feignFormEncoder() {
        return new SpringFormEncoder();
      }
    }
  3. feign遠程調用接口
    @FeignClient(name = "file",url = "http://localhost:8100",configuration = FeignSupportConfig.class)
    public interface UploadService {
      @RequestMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
      String handleFileUpload(@RequestPart(value = "file") MultipartFile file);
    }
  4. 上傳文件接口
    @RestController
    public class UploadController {
      @Autowired
      UploadService uploadService;
      
      @RequestMapping(value = "/uploadFile",method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
      public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) {
        return uploadService.handleFileUpload(file);
      }
    }

    2.3 測試

    使用postman進行測試,可以正常上傳文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM