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

  

  以上就是项目中遇到的问题及解决办法,希望能帮助到大家;若还有其他问题可参考上面的参考链接,里面也写了一些问题及解决办法。

  

原文地址:https://www.cnblogs.com/ntfblogs/p/11107335.html

时间: 2024-08-02 20:25:01

spring cloud —— feign文件上传的相关文章

spring cloud feign client 上传文件遇到问题记录

项目中用FeignClient上传文件时,发现大小无法大于1M,代码如下: MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<String, String>();OptUploadFileByteInfoReqDto optUploadFileByteInfoReqDto = new OptUploadFileByteInfoReqDto();optUploadFileByteInfoReqDto.

Spring MVC 多文件上传大小限制及异常处理

Spring MVC  多文件上传大小限制及异常处理 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 在 spring mvc 的默认配置文件 WEB-INF/xxx-servlet.xml 中

Ext4.2结合Spring MVC实现文件上传显示进度

1.实现原理: 在大文件上传时显示上传进度是很有必要的,不能让用户感觉到陷入无穷的等待中,或感觉程序已经卡死.为此我们可以在session中存一个上传进度的变量,在文件上传的过程中实时的去修改这个值,这就需要在后台重写Spring MVC自带的上传解析类,每上传一定的字节数就修改一下session中的进度,在前台通个AJAX请求每隔一定的时间去获取这个值显示给用户,这样就达到了显示上传进度的需求,不过这样频繁的请求服务器无疑是增加了服务器的压力,在没有使用任何第三方上传组件的情况下只能如此. 2

【Spring学习笔记-MVC-13】Spring MVC之文件上传

作者:ssslinppp       1. 摘要 Spring MVC为文件上传提供了最直接的支持,这种支持是通过即插即用的MultipartResolve实现的.Spring使用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver. 下面将具体讲解Spring MVC实现文件上传的具体步骤. 2. 添加Jar包 Spring MVC文件上传,需要添加如下两个jar包: commons-fil

spring mvc ajaxfileupload文件上传返回json下载问题

问题:使用spring mvc ajaxfileupload 文件上传在ie8下会提示json下载问题 解决方案如下: 服务器代码: @RequestMapping(value = "/addAnalysis", method = RequestMethod.POST) public void addAnalysisUI( HttpServletResponse response,HttpServletRequest request,HttpSession session, @Requ

Spring Boot入门——文件上传与下载

Spring Boot入门--文件上传与下载https://www.cnblogs.com/studyDetail/p/7003253.html 1.在pom.xml文件中添加依赖 复制代码 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/

Spring中实现文件上传

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt110 实现图片上传  用户必须能够上传图片,因此需要文件上传的功能.比较常见的文件上传组件有Commons FileUpload(http://jakarta.apache.org/commons/fileupload/a>)和COS FileUpload(http://www.servlets.com/cos),Spring已经完全集成了这两种组件,这里我们选择Commo

Spring 随笔05 文件上传

本小节你将建立一个可以接受HTTP multi-part 文件的服务. 你将建立一个后台服务来接收文件以及前台页面来上传文件. 要利用servlet容器上传文件,你要注册一个MultipartConfigElement类,以往需要在web.xml 中配置<multipart-config>,而在这里,你要感谢SpringBoot,一切都为你自动配置好了. 1.新建一个文件上传的Controller: 应用已经包含一些 存储文件 和 从磁盘中加载文件 的类,他们在cn.tiny77.guide0

spring boot实现文件上传下载

spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心.大部分的配置从开发人员可见变成了相对透明了,要想进一步熟悉还需要关注源码.1.文件上传(前端页面): <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&quo