我正试图上传一个图像到azure blob存储,两天前代码运行得很好,但最近我收到了一个错误,一个强制性的请求头丢失了。以下是返回的错误:
"<?xml version=\"1.0\" encoding=\"utf-8\"?><Error><Code>MissingRequiredHeader</Code><Message>An HTTP header that's mandatory for this request is not specified.\nRequestId:93cefc02-45af-41b0-9cb5-649d485faa49\nTime:2012-10-03T09:05:58.1982699Z</Message><HeaderName>x-ms-blob-type</HeaderName></Error>"让我解释一下程序流程。我正在使用nodejs服务器从azure创建一个SAS。然后windows 8客户端使用此sas将特定的文件放到blob存储中。
function uploadFileAsync(uploadURL, file) {
return new WinJS.Promise(function (complete, error, progress) {
file.openAsync(Windows.Storage.FileAccessMode.read).then(function (stream) {
makeBlob(file.contentType, stream).then(function (blob) {
WinJS.xhr({ url: uploadURL, type: "PUT", data: blob, headers: { "Content-type":
file.contentType} }).then(function (res) {
complete(res);
}, function (err) {
error(err);
});
});
});
});
}
function makeBlob(contentType, stream) {
return new WinJS.Promise(function (c, e) {
var blob = window.MSApp.createBlobFromRandomAccessStream(contentType, stream);
c(blob);
});
}uploadURL是节点服务器上的SAS。
我尝试添加另一个头"x-ms-blob-type": "BlockBlob"与PUT请求,但可惜没有用!!
WinJS.xhr({ url: uploadURL, type: "PUT", data: blob, headers: { "Content-type":
file.contentType, "x-ms-blob-type": "BlockBlob" } }).then(function (res) {我的团队和我已经尝试从许多安装上传它,使用我们应用程序的最基本(最古老的)版本,这些版本以前运行得很好。由此我们得出结论,一定有什么东西在天蓝色的层面上发生了变化。请指点!
更新:最后它又开始工作了,添加报头x-ms-blob类型做了这一次的技巧。费德勒真是帮了大忙谢谢高拉夫..。
然而,使用Fiddler向我透露了一些仍不清楚的事情。
1)以下是小提琴的请求和响应
Request:
PUT /dummy/Content/dummy.bmp?st=2012-10-06T06%3A53%3A49Z&se=2012-10-06T07%3A53%3A49Z&sr=dummy&sig=dummydummyNQ4%3D HTTP/1.1
Accept: */*
Filename: dummy.bmp
Content-Type: image/bmp
x-ms-blob-type: BlockBlob
Method: PUT
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)
Host: dummy.blob.core.windows.net
Content-Length: 85414
Connection: Keep-Alive
Pragma: no-cache
Response:
HTTP/1.1 201 Created
Transfer-Encoding: chunked
Content-MD5: MdRpPr+eOePkjry2+6myQg==
Last-Modified: Sat, 06 Oct 2012 06:57:45 GMT
ETag: "dummyTag"
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: dummyide-f2defa18c095
x-ms-version: 2011-08-18serviceVersion不应该是2012-02-12,因为我没有在任何地方指定它。那么,它不应该默认为最新版本。
2)根据这一页,http://msdn.microsoft.com/en-us/library/windowsazure/dd179451.aspx x-ms-blob-类型是一个可选的标题,那么为什么它说它是强制性的呢?
PS:添加所有所需的标题没有帮助。它仍然说强制性标题缺失(x-ms-blob-类型)。
发布于 2012-10-03 15:14:03
即使它在两天前对您有效,您是否可以尝试添加所需的标头从这一页 (例如,x-ms-date )。
发布于 2013-03-22 05:28:16
我点击这里寻找从StorageFile对象中获取blob或File的方法。你的makeblob功能给了我一个线索。谢谢。
我建议一种替代makeblob功能的方法。
function makeblob(storageFile)
{
return MSApp.createFileFromStorageFile(storageFile);
}调用站点也需要稍加修改,可以删除对file.OpenAsync的调用。
关于PUT blob api调用-
HTH。
https://stackoverflow.com/questions/12711150
复制相似问题