我遵循了 Gaurav Mantri 的这篇精彩文章,以便使用 HTML5/Javascript 将文件直接上传到 Blob 存储中。
但是我发现在上传部分期间,这部分代码失败并出现 403 错误。
有趣的是,这种情况是随机发生的。有时上传确实有效并且一切都成功完成,但大多数时候上传失败并出现 403 错误。
需要注意的一件事:我希望 Azure 很快就会添加 CORS 支持,但目前我使用的是 Chrome(使用 chrome.exe --disable-web-security 选项)来解决这个问题。
PUT https://mystorage.blob.core.windows.net/asset-38569007-3316-4350…Giv17ye4bocVWDbA/EQ+riNiG3wEGrFucbd1BKI9E=&comp=block&blockid=YmxvY2stMA==
403 (Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.)
$.ajax({
url: uri,
type: "PUT",
data: requestData,
processData: false,
beforeSend: function(xhr) {
xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');
xhr.setRequestHeader('Content-Length', requestData.length);
},
success: function (data, status) {
console.log(data);
console.log(status);
bytesUploaded += requestData.length;
var percentComplete = ((parseFloat(bytesUploaded) / parseFloat(selectedFile.size)) * 100).toFixed(2);
$("#fileUploadProgress").text(percentComplete + " %");
uploadFileInBlocks();
},
error: function(xhr, desc, err) {
console.log(desc);
console.log(err);
}
});
在 Azure 中创建 Assets /定位器/文件之后,在实际开始上传部分之前,我设置了 30 秒的延迟,以便为定位器的传播提供时间。
对我可能缺少的内容有什么建议吗?
最佳答案
非常感谢 Gaurav 为我指明了问题的方向。
事实证明,我正在对服务器进行 JSON 调用,该服务器将创建 Assets /定位器/策略,然后返回上传 uri。
但是我的上传 uri 类型为 Uri,当 JSON 序列化它时,它没有正确编码。
将我的 uri 对象(在服务器上)更改为 string (并调用 uploaduri = (new UriBuilder(theuri)).ToString(); )后返回到 Web 客户端的数据已正确编码,我不再收到 403 错误。
因此,请注意,如果您遇到同样的问题,您可能需要查看上传 uri 的编码。
关于azure - 使用 JavaScript 将文件放入 Blob 存储会导致 403(服务器无法验证请求),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17432291/