首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将文件(图像n vdo)上载到blob存储,因此出现错误:缺少"x-ms-blob-type“的强制标头。

无法将文件(图像n vdo)上载到blob存储,因此出现错误:缺少"x-ms-blob-type“的强制标头。
EN

Stack Overflow用户
提问于 2012-10-03 14:55:50
回答 2查看 3.5K关注 0票数 4

我正试图上传一个图像到azure blob存储,两天前代码运行得很好,但最近我收到了一个错误,一个强制性的请求头丢失了。以下是返回的错误:

代码语言:javascript
复制
"<?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存储中。

代码语言:javascript
复制
 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请求,但可惜没有用!!

代码语言:javascript
复制
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)以下是小提琴的请求和响应

代码语言:javascript
复制
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-18

serviceVersion不应该是2012-02-12,因为我没有在任何地方指定它。那么,它不应该默认为最新版本。

2)根据这一页,http://msdn.microsoft.com/en-us/library/windowsazure/dd179451.aspx x-ms-blob-类型是一个可选的标题,那么为什么它说它是强制性的呢?

PS:添加所有所需的标题没有帮助。它仍然说强制性标题缺失(x-ms-blob-类型)。

EN

回答 2

Stack Overflow用户

发布于 2012-10-03 15:14:03

即使它在两天前对您有效,您是否可以尝试添加所需的标头从这一页 (例如,x-ms-date )。

票数 0
EN

Stack Overflow用户

发布于 2013-03-22 05:28:16

我点击这里寻找从StorageFile对象中获取blob或File的方法。你的makeblob功能给了我一个线索。谢谢。

我建议一种替代makeblob功能的方法。

代码语言:javascript
复制
function makeblob(storageFile)
{
    return MSApp.createFileFromStorageFile(storageFile);
}

调用站点也需要稍加修改,可以删除对file.OpenAsync的调用。

关于PUT blob api调用-

  1. 建议显式放置x-ms版本标题。
  2. 您的sas客户端是在做其他事情,如放置sharedkey授权头等,还是公开blob?
  3. 我也在解决类似的问题- win8客户端,nodejs服务器,上传图像到天蓝色存储。目前,我得到了直接上传到蓝色的博客工作。我正在探索如何使用共享访问签名来查看win8客户端是否可以直接与put blob对话,而不是通过nodejs服务器(在nodejs服务器上保存一些负载)。还没调查完呢。

HTH。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12711150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档