由于缺少x-ms-blob类型,ADLS Gen2中的创建路径失败了吗?

时间:2020-07-07 12:54:59

标签: authentication azure-storage-blobs azure-rest-api azure-data-lake-gen2 azure-sas

我创建了一个带有Azure Data Lake Storage Gen2的Azure存储帐户。我想使用REST API上传文件。在Shared Keys上使用授权可以很好地工作,但在使用account SAS时却遇到问题。

对于路径创建,我使用Path - Create操作。

# provide Azure Data Lake Storage Gen2 URL as environment variable
$ ADLS_URL="https://xxxxx.blob.core.windows.net/files"

# provide account SAS as environment variable
$ SAS="sv=2017-07-29&ss=bf&..."

# Create a new path in ADLS Gen2
$ curl -vX PUT -H "Content-Length: 112" "$ADLS_URL/example.txt?resource=file&$SAS" 

请求返回400 An HTTP header that's mandatory for this request is not specified.和以下错误消息。

<Error>
  <Code>MissingRequiredHeader</Code>
  <Message>An HTTP header that's mandatory for this request is not specified. RequestId:870e754b-... Time:2020-07-07T...</Message>
  <HeaderName>x-ms-blob-type</HeaderName>
</Error>

原来,Creation of a blob in the Blob storage需要缺少标头。由于ADLS Gen2同时支持这两种API,并且都提供了类似的操作,因此它将请求委派给错误的API。

是否可以通过ADLS Gen2 API上的SAS使用PUT操作创建路径?

1 个答案:

答案 0 :(得分:1)

是的,您可以使用ADLS Gen2 API上的SAS使用PUT操作创建路径(在此示例中为文件)。但是您需要执行3个步骤:创建一个空文件 / 将数据添加到该空文件 / 刷新数据

步骤1::生成sas令牌后,您需要调用Path - Create在ADLS Gen2中创建文件。 注意:,此处文件应为空,这意味着在请求标头中,Content-Length应该为0

请求网址如下:

https://xxx.dfs.core.windows.net/aaa/myfile999.txt?resource=file&sv=2019-10-10&ss=bfqt&srt=sco&sp=rwdlacupx&se=2020-07-08T10:31:37Z&st=2020-07-08T02:31:37Z&spr=https&sig=xxxx

在这里,我用工具postman测试了它,它没有问题。可以在azure门户中的ADLS Gen2上创建空文件:

enter image description here

第2步和第3步:

然后您应该致电Path - Update以获得附加数据

最后,再次致电Path - Update以获取刷新数据

如果您不知道如何使用Path - Update进行这些操作,请使用提琴手查看详细的请求信息,或者让我知道:)。这是Fiddler捕获的请求的屏幕截图:

enter image description here

顺便说一句,,我建议您可以直接将Put Blob api sas令牌一起使用(但您需要在请求标头中指定x-ms-blob-type) ,这只是创建文件和上传内容的第一步。