栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何取消数据事件的HTTP上传?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何取消数据事件的HTTP上传?

正确的,符合规范的操作仅是尽早发送HTTP
413响应-
也就是说,一旦您检测到客户端发送的字节数超过了您想要处理的字节数。发送错误响应后是否终止套接字取决于您。这符合RFC 2616 :(添加了重点)

413请求实体太大

服务器拒绝处理请求,因为请求实体大于服务器愿意或能够处理的实体。 服务器可以关闭连接,以防止客户端继续请求。

接下来发生的事情并不理想。

  • 如果您将套接字保持打开状态,则所有浏览器(Chrome 30,IE 10,Firefox 21)将继续发送数据,直到整个文件上传完毕。然后只有这样,浏览器才会显示您的错误消息。这真的很糟糕,因为用户必须等待整个文件才能完成上传,而只是发现服务器拒绝了它。这也会浪费您的带宽。

该浏览器目前的行为是违反RFC 2616的§
8.2.2:

发送消息正文的HTTP /
1.1(或更高版本)客户端应该在传输请求时监视网络连接的错误状态。如果客户端看到错误状态,它应该立即停止发送主体。如果使用“块式”编码发送正文(第3.6节),则可以使用零长度的块和空的预告片来过早地标记消息的结尾。如果主体之前是Content-
Length标头,则客户端务必关闭连接。

Chrome和Firefox存在开放问题,但是不要指望很快会修复。

  • 如果在发送HTTP 413响应后立即关闭套接字,则所有浏览器显然都将立即停止上载,但是 它们 大多数 当前显示“连接重置”错误(或类似错误),而不是您可能在响应中发送的任何HTML。

同样,这可能违反了规范(允许服务器提前发送响应并关闭连接),但是我也不希望浏览器在此之前很快得到修复。

更新: 从4/15开始,Chrome 可能会 在您提前关闭连接时显示413 HTML。仅当浏览器在Linux和Mac OS
X上运行时,此方法才有效。在Windows上,Chrome仍然显示

ERR_CONNECTION_RESET
网络错误,而不是您发送的HTML。(IE
11和Firefox 37继续在所有平台上显示网络错误。)

因此,您可以使用传统的纯HTTP上传方式进行选择:

  • 仅在上传运行完成后显示友好的错误消息。这浪费时间和带宽。

  • 快速失败,但让用户困惑于浏览器的错误屏幕。

在这里最好的选择是使用AJAX上传器,您可以在其中更好地控制用户体验。您仍然应该提供传统的上传表单作为后备,并且我将使用“快速失败”选项(关闭套接字)来避免浪费时间和带宽。

这是一些示例代码,如果收到的请求超过1 kB,该示例代码将杀死该请求。我使用的是Express,但对节点的普通HTTP库也应如此。

注意: 实际上,您应该使用 强大的
多方来处理您的上载(这是Connect /
Express所使用的),并且它有自己的方式来监视上载数据。

var express = require("express")    , app = express();app.get('/', function(req, res) {    res.send('Uploads &gt; 1 kB rejected<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"><input type="submit"></form>');});app.post('/upload', function(req, res) {    var size = 0;    var gotData = function(d) {        size += d.length; // add this chunk's size to the total number of bytes received thus far        console.log('upload chunk', size);        if (size > 1024) { console.log('aborting request'); req.removeListener('data', gotData); // we need to remove the event listeners so that we don't end up here more than once req.removeListener('end', reqEnd); res.header('Connection', 'close'); // with the Connection: close header set, node will automatically close the socket... res.send(413, 'Upload too large'); // ... after sending a response        }    };    var reqEnd = function() {       res.send('ok, got ' + size + ' bytes');    }    req.on('data', gotData);    req.on('end', reqEnd);});app.listen(3003);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/594988.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号