我正在使用play框架来生成分块响应.代码是:
class Test extends Controller {
public static void chunk() throws InterruptedException {
for (int i = 0; i < 10; i++) {
String data = repeat("" + i, 1000);
response.writeChunk(data);
Thread.sleep(1000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用浏览器访问时http://localhost:9000/test/chunk,我可以看到显示的数据每秒都在增加.但是,当我编写一个javascript函数来接收和处理数据时,发现它将阻塞直到收到所有数据.
代码是:
$(function(){
$.ajax(
"/test/chunked",
{
"success": function(data, textStatus, xhr) {
alert(textStatus);
}
}
);
});
Run Code Online (Sandbox Code Playgroud)
收到所有数据后,我可以看到10秒后弹出一个消息框.
如何获取流并及时处理数据?
我有一个REST API,通过HTTP Post接受音频文件.API支持Transfer-Encoding:chunked请求标头,以便在从客户端上运行的记录器创建文件时,可以将文件分段上传.这样,服务器可以在文件到达时开始处理文件以提高性能.例如:
HTTP 1.1 POST .../v1/processAudio
转移编码:分块
[Chunk 1 256 Bytes](服务器到达时开始处理)
[块2 256字节]
[块3 256字节]
...
音频文件通常较短,大小约为10K到100K.我有C#和Java代码正在工作,所以我知道API工作.但是,我似乎无法使用javascript在浏览器中进行录制和上传工作.
这是我的测试代码,使用Transfer-Encoding对localhost执行POST:
<html>
<script type="text/javascript">
function streamUpload() {
var blob = new Blob(['GmnQPBU+nyRGER4JPAW4DjDQC19D']);
var xhr = new XMLHttpRequest();
// Add any event handlers here...
xhr.open('POST', '/', true);
xhr.setRequestHeader("Transfer-Encoding", "chunked");
xhr.send(blob);
}
</script>
<body>
<div id='demo'>Test Chunked Upload using XHR</div>
<button onclick="streamUpload()">Start Upload</button>
</body>
</html>Run Code Online (Sandbox Code Playgroud)
问题是我在Chrome中收到以下错误
拒绝设置不安全的标题"Transfer-Encoding"
streamUpload @ uploadTest.html:14 onclick @ uploadTest.html:24
在查看XHR文档后,我仍然感到困惑,因为它没有讨论不安全的请求标头.我想知道XHR是否可能不允许或实现Transfer-Encoding:为HTTP POST 分块?
我已经看过使用多个XHR.send()请求和WebSockets的工作,但两者都是不受欢迎的,因为它需要对已经存在的服务器API进行重大更改,简单,稳定和有效.唯一的问题是我们似乎无法通过Transfer-Encoding从具有psedo-streaming的浏览器POST:chunked request header.
任何想法或建议都会非常有帮助.