我有一个通过 HTTP Post 接受音频文件的 REST API。该 API 支持 Transfer-Encoding: 分块请求标头,以便文件可以在从客户端上运行的记录器创建时分段上传。这样,服务器可以在文件到达时开始处理文件以提高性能。例如:
HTTP 1.1 POST .../v1/processAudio
传输编码:分块
[Chunk 1 256 Bytes](服务器到达时开始处理)
[块 2 256 字节]
[块 3 256 字节]
...
音频文件通常很短,大小约为 10K 到 100K。我有 C# 和 Java 代码可以工作,所以我知道 API 可以工作。但是,我似乎无法使用 javascript 在浏览器中进行录制和上传。
这是我的测试代码,它使用传输编码对本地主机进行 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>
问题是我在 Chrome 中收到以下错误
拒绝设置不安全的标头“Transfer-Encoding”
streamUpload@uploadTest.html:14 onclick@uploadTest.html:24
在查看 XHR 文档后,我仍然感到困惑,因为它没有谈论不安全的请求标头。我想知道 XHR 是否可能不允许或实现传输编码:为 HTTP POST 分块?
我已经查看了使用多个 XHR.send() 请求和 WebSockets 的变通方案,但两者都是不可取的,因为它需要对已经到位、简单、稳定和工作的服务器 API 进行重大更改。唯一的问题是我们似乎无法通过 Transfer-Encoding: 分块请求标头从具有伪流的浏览器进行 POST。
任何想法或建议都会非常有帮助。