我有一个REST API,它通过HTTP Post接受音频文件。 API支持Transfer-Encoding:chunked请求标头,以便在从客户端上运行的记录器创建文件时,可以将文件分段上传。这样,服务器可以在文件到达时开始处理文件以提高性能。例如:
HTTP 1.1 POST ... / v1 / processAudio
Transfer-Encoding:chunked
[Chunk 1 256 Bytes](服务器到达时开始处理)
[Chunk 2 256 Bytes]
[Chunk 3 256 Bytes]
...
音频文件通常很短,大小约为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>
&#13;
问题是我在Chrome中收到以下错误
拒绝设置不安全的标题&#34;转移编码&#34;
streamUpload @ uploadTest.html:14 onclick @ uploadTest.html:24
在查看XHR文档后,我仍然感到困惑,因为它没有谈论不安全的请求标头。我想知道XHR是否可能不允许或实施 Transfer-Encoding:chunked 用于HTTP POST?
我已经查看了使用多个XHR.send()请求和WebSockets的工作,但两者都是不受欢迎的,因为它需要对已经存在,简单,稳定和有效的服务器API进行重大更改。唯一的问题是我们似乎无法通过Transfer-Encoding从psedo-streaming的浏览器发布POST:chunked request header。
任何想法或建议都会非常有用。
答案 0 :(得分:1)
正如评论中所提到的,您不允许设置该标头,因为它由用户代理控制。
对于完整的标头集,请参阅W3C XMLHttpRequest Level 1中的4.6.2 The setRequestHeader() method,并注意Transfer-Encoding
是用户代理控制的标头之一,以便让它控制传输的这些方面。
WhatWG Fetch API生活标准中有类似的列表。 https://fetch.spec.whatwg.org/#terminology-headers