我有一个 MVC 应用程序,它允许用户使用动态生成的 SAS 将资源上传到 blob 存储。用户将选择一个文件并单击上传。单击上传时,将向控制器操作发送一个 ajax 调用,该操作将为容器生成一个 SAS 并返回一个字符串,该字符串是要上传的带有签名的 blob 的 URI。这完美地工作并使用 SAS 返回正确的 URI。然后我有另一个 ajax 调用,它将使用返回的 URI 将文件中的数据放入 Azure Blob 存储。执行此操作时,我在 Jquery.min 文件中收到一个 javascript 运行时错误,显示“0x80070005 访问被拒绝”。
我想确保我已经正确编码并且我的 SAS 是正确的,所以我通过 Runscope 运行它(我让 MVC 控制器操作修改 URI 以通过我的 Runscope 帐户)。如果我复制了 URI 并手动设置了我在 ajax 调用中设置的标头,它就起作用了。并且权限设置有效。使用我生成的 SAS,我可以访问该文件,没有它我不能。如果我让它通过我的 ajax 调用运行我的 javascript 文件,它会失败并返回 405 错误。这是我的 ajax 调用,然后是我使用 Runscope 发送的两个不同请求。
我用这篇文章 http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/#comment -1700 作为分块上传文件的指南。以下 ajax 调用将为每个上传的块执行,但在第一次尝试时失败。
var uri = submitUri + "&comp=block&blockid=" + blockIds[blockIds.length - 1];
var requestData = new Uint8Array(evt.target.result);
$.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() {
// successful stuff here
uploadFileInBlocks();
}
error: function (xhr, desc, err) {
// error stuff here
}
});
这是我的 Runscope 结果:
成功的手动请求:
PUT https://<myaccount>.blob.core.windows.net/trainingcourseresources/1002/georgewashington.jpg?sr=c&sp=rw&sig=GI+HN1hTEiyTG9Kz1OIBIcArAEkeZWyxI4v7OmMuEsA=&sv=2012-02-12&se=2013-09-17T13:19:52Z
HEADERS
Accept: */*
Accept-Encoding: gzip, deflate, compress
Connection: close
Host: atlastestblob.blob.core.windows.net
User-Agent: runscope/0.1
X-Ms-Blob-Type: BlockBlob
QUERYSTRING
se: 2013-09-17T13:19:52Z
sig: GI+HN1hTEiyTG9Kz1OIBIcArAEkeZWyxI4v7OmMuEsA=
sp: rw
sr: c
sv: 2012-02-12
Response: 201 Created
ajax请求失败:
OPTIONS https://<myaccount>.blob.core.windows.net/trainingcourseresources/1002/cslewis.jpg?sp=rw&sr=c&blockid=YmxvY2stMDAwMDAw&sv=2012-02-12&sig=iIn/AL3eBBFlZdYoT717SMS9iDOY5PEKIdIufOle7NA=&comp=block&se=2013-09-17T13:40:00Z
HEADERS
Accept: */*
Accept-Encoding: gzip, deflate
Access-Control-Request-Headers: content-type, accept, x-ms-blob-type
Access-Control-Request-Method: PUT
Cache-Control: no-cache
Connection: close
Dnt: 1
Host: atlastestblob.blob.core.windows.net
Origin: https://localhost:44308
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
QUERYSTRING
blockid: YmxvY2stMDAwMDAw
comp: block
se: 2013-09-17T13:40:00Z
sig: iIn/AL3eBBFlZdYoT717SMS9iDOY5PEKIdIufOle7NA=
sp: rw
sr: c
sv: 2012-02-12
Response: 405 The resource doesn't support specified Http Verb