Spring boot 尝试通过spring云网关和RestController上载文件

Spring boot 尝试通过spring云网关和RestController上载文件,spring-boot,put,spring-restcontroller,reactive,spring-cloud-gateway,Spring Boot,Put,Spring Restcontroller,Reactive,Spring Cloud Gateway,我试图通过spring引导网关上传(放置)一个文件,将请求转发给内部RestController(请参阅DemoController.java)。我可以读取数据,但连接保持打开状态。 网关路由通过application.yml进行配置 演示代码和curl请求可在以下位置找到: 启动spring引导应用程序并调用: curl——用户:secret-vhttp://localhost:8080/api/testing/README.md \ --上传文件README.md 更新: 同时,我可以读

我试图通过spring引导网关上传(放置)一个文件,将请求转发给内部RestController(请参阅DemoController.java)。我可以读取数据,但连接保持打开状态。 网关路由通过application.yml进行配置

演示代码和curl请求可在以下位置找到:

启动spring引导应用程序并调用:

curl——用户:secret-vhttp://localhost:8080/api/testing/README.md \
--上传文件README.md
更新:

同时,我可以读取文件,但服务器端的连接没有关闭。这是一种正常的反应行为,我需要主动关闭连接吗?我意识到用Mono包装它会关闭连接,但不再读取数据

当前,RestController方法如下所示:

@PutMapping(value = "/{value}/**", consumes = "application/octet-stream")
public  Mono<ResponseEntity>  putArtifact(ServerHttpRequest request,
   @RequestBody ByteArrayResource resource, @PathVariable("value") String value) {
   [...]
}
@PutMapping(value=“/{value}/**”,consumes=“application/octet stream”)
公共单输入工件(ServerHttpRequest请求,
@RequestBody ByteArrayResource资源,@PathVariable(“值”)字符串值){
[...]
}
提前Thx

/大卫

简短的回答 解决方法是在curl命令的末尾添加
-H'Expect'

细节 它是关于Http 100继续状态代码的。当服务器可能拒绝请求(可能是因为文件太大)时,客户机可以首先向服务器询问是否接受请求。因此,客户端和服务器都不会在以下情况下浪费时间:例如:可能会因为文件大小而被拒绝

当发送PUT请求时,默认情况下会将“Expect 100 continue”卷曲到请求(如果大小大于某个阈值,也会在POST中添加)。我期望在这种情况下,服务器将使用HTTP100进行响应,但似乎可能会出现

-H'Expect'
添加到命令末尾意味着您作为客户端将不再等待来自服务器的HTTP 100状态来发送请求。但这仍然是一个问题,应该调查其根本原因。可能是因为有两台服务器在处理HTTP100(网关+服务器),所以客户端不知怎么挂断了。这些也在本文中提到