spring cloud —— feign文件上傳


前言

  最近項目中需要用feign調用cloud微服務實現文件上傳,但是FeignClient調用接口時不支持上傳文件;

  本項目采用Feign-form擴展庫進行實現文件上傳,期間也遇到了很多問題,在這里就和大家分享一下遇到的問題和解決辦法。

  以下是我感覺比較實用的一些博客,我雖然沒有全部遇到博主們說的那些問題,但是相信這些會對大家有所幫助。

參考

  http://www.mamicode.com/info-detail-2311867.html

  https://blog.csdn.net/ytzzh0726/article/details/79467843

  https://blog.csdn.net/hlp4207/article/details/81235487

       http://blog.xuahua.com/articles/2018/11/16/1542340328956.html

  https://zhuanlan.zhihu.com/p/62167643

項目中遇到的問題

  1.Feign-form庫只支持單文件上傳

   項目中本來想同時支持多個文件上傳,但是反復試了許多次 都是一直報錯;后來百度發現只支持單文件上傳,要想實現多文件上傳,請參考上面的參考鏈接。異常信息如下:

1 feign.codec.EncodeException: class [Lorg.springframework.web.multipart.MultipartFile; is not a type supported by this encoder.
2     at feign.codec.Encoder$Default.encode(Encoder.java:90) ~[feign-core-9.5.0.jar:na]
3     at feign.form.FormEncoder.encode(FormEncoder.java:87) ~[feign-form-3.0.3.jar:3.0.3]
4     at feign.form.spring.SpringFormEncoder.encode(SpringFormEncoder.java:62) ~[feign-form-spring-3.0.3.jar:3.0.3]
5     at feign.ReflectiveFeign$BuildEncodedTemplateFromArgs.resolve(ReflectiveFeign.java:351) ~[feign-core-9.5.0.jar:na]
6     at feign.ReflectiveFeign$BuildTemplateByResolvingArgs.create(ReflectiveFeign.java:213) ~[feign-core-9.5.0.jar:na]
7     at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:72) ~[feign-core-9.5.0.jar:na]
8     at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103) ~[feign-core-9.5.0.jar:na]

   2.encoder配置類

   項目中既要用feign調用普通微服務接口,又要調用文件上傳接口,按照網上的配置之后,調用普通的微服務接口就會報錯,報錯信息和上面的報錯信息類似,就不貼異常信息了。經過不斷的查閱資料,終於找到了不會影響其他feign接口調用的配置,配置信息如下:

 1 /**
 2  * 引用配置類MultipartSupportConfig.並且實例化
 3  */
 4  @Scope("prototype")
 5  @Primary
 6  @Configuration
 7  class MultipartSupportConfig {
 8      @Autowired
 9      private ObjectFactory<HttpMessageConverters> messageConverters;
10      @Bean
11      public Encoder feignFormEncoder() {
12          return new SpringFormEncoder(new SpringEncoder(messageConverters));
13      }
14  }

   3.FeignClient接口里方法參數是文件類型的要用@RequestPart注解,且要設置ContentType為multipart/form-data

   :consumers屬性設置為multipart/form-data,該屬性不可缺少。

   :服務類里面調用的時候,需要注意一下MultipartFile的第一個參數一定要和@RequestPart聲明的名字保持一致。

   FeignClient接口中方法聲明如下:

1 /**
2  * 上傳文件
3  * @param files
4  * @return
5  */
6  @PostMapping(value = "/test/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
7  Base<List<DTO>> upload(@RequestPart(value = "file") MultipartFile file);

   服務類里面調用FeignClient文件上傳接口代碼如下:

1 byte[] b = new byte[1014];
2 MultipartFile multipartFile = new MockMultipartFile("file", "demo.pdf", ContentType.APPLICATION_OCTET_STREAM.toString(), new ByteArrayInputStream(b));
3 Base<List<DTO>> upload = fileUpService.upload(multipartFile);

   

  以上就是項目中遇到的問題及解決辦法,希望能幫助到大家;若還有其他問題可參考上面的參考鏈接,里面也寫了一些問題及解決辦法。

  


免責聲明!

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



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