我正在编写一个Spring控制器,它处理来自客户端的HTTP PUT请求,生成S3预签名的url,并发出HTTP307状态(临时重定向)代码。因此,基本上我是在对客户端进行身份验证,如果身份验证成功,则要求他写入s3文件夹。客户端能够写入签名的url位置。
现在我担心的是客户端必须上传两次。一次到我的应用服务器,然后到s3,所以操作将花费两倍的时间。
我的理解是正确的吗?在这种情况下,客户端真的写2吗?或者,客户端是否足够智能,只先推送部分有效负载,如果成功,则推送整个有效负载?
我读到了HTTP100状态代码,但看起来应用服务器/tomcat已经发出了它,并且不在我的控制之下。
这是我的弹簧控制器
@RequestMapping("/upload")
public ResponseEntity<Void> execute(HttpServletRequest request) throws IOException, ServletException {
HttpHeaders headers = new HttpHeaders();
String redirectUrl = getRedirectUrl(requestURI, request.getMethod());
headers.setLocation(new URI(redirectUrl));
ResponseEntity<Void> redirectEntity = new ResponseEntity<Void>(null,headers,HttpStatus.TEMPORARY_REDIRECT);
return redirectEntity;
}如何阻止clint将整个有效负载上传到我的应用服务器?
发布于 2017-05-06 21:06:45
所以我的理解是正确的吗?
答案是肯定的。服务端读取包含body的完整请求后,会发送PUT请求的响应。当你的客户端重复这个请求时,在响应307 (Temporary Redirect)时,它就像一个新的http请求。
此外,在此方法中还应考虑使用spec中的307响应代码(见下文)的要点。
如果接收到307状态代码以响应其他请求,则为
,则用户代理不能自动重定向
请求,除非它可以被用户确认,因为这可能
更改发出请求的条件。
在点上
How can i prevent client from uploading the entire payload to my app server?您可以从控制器在后台上传到s3,并返回重定向响应(301?)指向将返回上载请求状态的URL。
发布于 2017-05-03 09:20:51
这不是HTTP的工作方式,除了关闭连接之外,HTTP没有停止文件上传的机制,但是如果您关闭连接,您将无法返回重定向信息。
如果您希望客户端直接上传到S3,则需要分两步完成。
让客户端请求文件传输的URL,然后让客户端使用所需的URL启动传输。
https://stackoverflow.com/questions/43689657
复制相似问题