问题描述:

最近一个上传文件的功能,上传了一个较大的文件700M,一直出现接收的文件为空的问题,内存和磁盘都非常充足,也没有出现内存溢出的错误,一直都是空指针的问题,这让我百思不得七届.经过一系列的源码追踪才最终发现了问题所在

 

环境:

通过spring cloud zuul 路由转发到对应的文件上传服务,并且加了前缀为/zuul的路径,直接跳过spring mvc的文件处理

 

解决办法和过程:

经过自己不断的测试,小文件上传是没有任何问题的,但是一旦出现了较大的文件那么上传的文件则为空.下面上源码,最后转发微服务的代码在这个类中RibbonRoutingFilter;

zuul网关上传大文件到微服务file为空的问题

zuul网关上传大文件到微服务file为空的问题

zuul网关上传大文件到微服务file为空的问题

 

问题就出在了下面的方法中,因为我开启了网关重试机制,所以会走下面的if (!(this.requestEntity instanceof ResettableServletInputStreamWrapper)) 这个方法,,但是因为文件过大,读取会失败,只会读取到了一部分的流,但是上下文对象记录的是完整的流长度,最后转发到微服务的时候就会出现封装失败,空指针的问题,而小文件则没有关系可以全部读取出来.

zuul网关上传大文件到微服务file为空的问题

 

 最后想解决这个问题的话有三个方案可以给大家参考一下

1. 关闭网关重试机制

2. 文件上传接口不使用网关转发

3. 使用nginx反向代理

相关文章: