5

我知道如何使用 XmlHttpRequest 对象在 javascript 中处理分块下载。有什么方法可以使用 javascript 执行分块上传,打开连接但只能一点一点地上传数据块?

我知道使用 Http 1.1 服务器应该可以进行分块上传,并且找到了很多关于使用各种其他平台(C# java 等)进行分块上传的参考,但在浏览器中没有找到任何关于使用 javascript 这样做的参考。

编辑:用例是将数据流式传输到服务器,而不是上传大文件,类似于使用分块响应将数据流式传输到客户端。这是发出单个 ajax 请求的替代方法,因为从客户端到服务器的数据块非常频繁(< 0.5 秒间隔)。

4

2 回答 2

1

截至今天(2021 年 11 月),我相信浏览器中仍然很大程度上缺少对使用 HTTP 分块数据传输的 UPLOADS 的支持。

如果您查看Request (Fetch API)的浏览器支持矩阵的“在请求正文中发送 ReadableStream”列,您可以看到当前对于除“Deno”之外的所有浏览器都是“否”。但是,您会注意到列旁边的“实验”标志。因此,它在某些浏览器(例如 Chrome)中是实验性的。不过,我不会屏住呼吸说它很快就会成为主流。

HTTP 分块数据传输编码在技术上不是一次发送数据块的必要条件,我相信常规 HTTP 数据传输也一次只发送数据块,但是“分块”是在 TCP 级别完成的(请更正如果我在这里错了,我)。因此,两种协议都可用于流式传输文件上传。WebSockets 当然也是另一种选择。选择哪种协议的主要区别在于您是否提前知道流的最终长度。

如果您需要流式上传您事先不知道其长度的数据(例如实时视频、视频电话会议、远程桌面会话、聊天等),那么您最好的选择可能是 WebSocket API(或内置的东西)在它的上面)。

如果您需要提前知道长度的上传数据(文件、图像、视频等),那么我相信您最好的选择可能是使用Fetch API甚至XmlHttpRequestAPI的普通 POST 或 PUT 。

于 2021-11-17T20:35:46.230 回答
-1

您可以使用 FileReader API 和 slice 方法。

使用切片,您可以获得可以上传的数据块,然后您需要在服务器端重新组装它们。

这是关于如何在 javascript http://www.html5rocks.com/en/tutorials/file/dndfiles/中处理文件的一个很好的介绍

您可以查看http://caniuse.com/#feat=filereader以获取浏览器支持

于 2012-07-16T05:54:34.497 回答