到微软图形API的XMLHttpRequest在IE 11中终止



我使用以下代码上传一个大文件(但小于62MB)到OneDrive使用Microsoft Graph API。

let req = new XMLHttpRequest();
req.open("PUT", url, true);
req.setRequestHeader("Authorization", "Bearer " + this.authProvider.tokens.graph);
req.setRequestHeader("Content-Length", file.size.toString());
req.setRequestHeader("Content-Range", "bytes 0-" + (file.size - 1).toString() + "/" + file.size.toString() );
req.upload.onprogress = (e) => {
    let progress = Math.floor(e.loaded / e.total * 100);
    console.log(progress);
};
req.upload.onerror = (e: any) => {
    console.log("error");
};
req.onload = (e) => {
    console.log("done");
};
req.send(buffer);

这是从Chrome(最新版本到目前为止),但创建会话后,上传是失败的从创建会话请求返回的url。我在IE 11控制台中得到错误SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied.,在网络选项卡中,我看到请求状态为aborted,发起者是CORS Preflight请求。根据其他测试,我认为错误来自req.open("PUT", url, true);行。

- update -

它实际上是飞行前的CORS(选项)请求返回的URL,实际上是失败的,在Chrome浏览器中通过只是很好。

问题可能是您正在设置Content-Length头。你不应该在这里显式地设置这个头(在任何情况下,它都只是当前请求的长度,而不是整个文件的长度)。

虽然这听起来很武断,但我对发生了什么有一个理论,但我现在无法测试它。我的理论是IE失败的CORS预飞行,因为服务器没有明确地宣布内容长度作为一个允许的头(因为它在默认的头总是允许的集合)。IE可能正在对您试图发送的标题进行显式检查,而CORS预飞行在其允许列表中返回的内容。

您应该停止设置Content-Length头,希望这也能解决您的问题。如果没有,请告诉我,我将深入研究。

最新更新