是否有类似XHR的浏览器API可用于通过HTTP将二进制文件流式传输到服务器?
我希望随着时间的推移制作HTTP PUT请求并以编程方式创建数据 . 我不想一次创建所有这些数据,因为它可能会存在于内存中 . 一些psueudo代码来说明我所得到的:
var dataGenerator = new DataGenerator(); // Generates 8KB UInt8Array every second
var streamToWriteTo;
http.put('/example', function (requestStream) {
streamToWriteTo = requestStream;
});
dataGenerator.on('data', function (chunk) {
if (!streamToWriteTo) {
return;
}
streamToWriteTo.write(chunk);
});
我现在有一个Web套接字解决方案,但更喜欢常规HTTP以更好地与一些现有的服务器端代码互操作 .
EDIT: 我可以使用最前沿的浏览器API . 我正在查看Fetch API,因为它支持请求体的ArrayBuffers,DataViews,Files等 . 如果我能以某种方式伪造其中一个对象,以便我可以使用动态数据的Fetch API,这对我有用 . 我尝试创建一个Proxy对象,看看是否有任何方法被调用,我可以修补 . 不幸的是,似乎浏览器(至少在Chrome中)正在使用本机代码而不是JS版本进行读取 . 但是,如果我错了,请纠正我 .
5 回答
利用ReadableStream流传输任意数据的方法; RTCDataChannel以Uint8Array的形式发送和,或接收任意数据; TextEncoder创建
8000
字节的随机数据存储在Uint8Array
,TextDecoder中解码Uint8Array
由RTCDataChannel
返回字符串进行演示,注意也可以使用FileReader .readAsArrayBuffer和.readAsText这里 .标记和脚本代码是在MDN - WebRTC: Simple RTCDataChannel sample的示例中修改的,包括adapter.js,其中包含
RTCPeerConnection
帮助程序; Creating your own readable stream .另请注意,当传输的总字节数达到
8000 * 8
时,示例流将被取消:64000
plnkr http://plnkr.co/edit/cln6uxgMZwE2EQCfNXFO?p=preview
你可以使用
Promise
,setTimeout
,递归 . 另见PUT vs POST in RESTServer-Sent Events和WebSockets是首选方法,但在您的情况下,您希望创建一个Representational状态转移,REST,API并使用长轮询 . 见How do I implement basic “Long Polling”?
在客户端和服务器端都处理长轮询过程 . 必须配置服务器脚本和http服务器以支持长轮询 .
除了长轮询,短轮询(XHR / AJAX)需要浏览器轮询服务器 .
我'm currently searching for exactly the same thing (upstreaming via Ajax). What I currently found, looks as if we are searching at the bleeding edge of browser'的功能设计;-)
XMLHttpRequest definition告诉我在步骤4 bodyinit中提取的内容是(或可以是)readablestream .
我仍在搜索(作为非web开发人员)以获取有关如何创建此类事物以及将数据提供到"readablestream"的"other end"(其应该是"writablestream",但我还没有找到)的信息 .
也许你更善于搜索,如果你找到了实现这些设计方案的方法,可以在这里发帖 .
^ 5
斯文
我不知道如何使用纯HTML5 API执行此操作,但一种可能的解决方法是使用Chrome应用作为后台服务来为网页提供其他功能 . 如果您已经愿意使用开发浏览器并启用实验性功能,那么这似乎只是一个渐进的步骤 .
Chrome应用可以调用chrome.sockets.tcp API,您可以在其上实现所需的任何协议,包括HTTP和HTTPS . 这将提供实现流式传输的灵活性 .
只要App declares this usage,常规网页就可以使用chrome.runtime API与App交换消息 . 这将允许您的网页对您的应用程序进行异步调用 .
我写了这个简单的应用程序作为概念证明:
的manifest.json
background.js
此应用程序没有用户界面 . 它侦听连接并对
http://httpbin.org/put
进行硬编码的PUT请求(httpbin是一个有用的测试站点,但请注意它does not support chunked encoding) . PUT数据(当前硬编码为正好17个八位字节)从客户端流入(根据需要使用少量或多个消息)并发送到服务器 . 来自服务器的响应将流回客户端 .这只是一个概念证明 . 一个真正的应用程序应该:
连接到任何主机和端口 .
使用Transfer-Encoding:chunked .
表示流数据的结束 .
处理套接字错误 .
支持TLS(例如Forge)
这是一个示例网页,使用App作为服务执行流上传(17个八位字节)(请注意,您必须配置自己的App ID):
当我在安装了App的Chrome浏览器中加载此网页时,httpbin会返回: