由于缺少 x-ms-blob-type,在 ADLS Gen2 中创建路径失败?

Posted

技术标签:

【中文标题】由于缺少 x-ms-blob-type,在 ADLS Gen2 中创建路径失败?【英文标题】:Create path in ADLS Gen2 fails because of missing x-ms-blob-type? 【发布时间】:2020-10-27 17:48:52 【问题描述】:

我使用 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】:

是的,您可以在 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 上创建空文件:

第 2 步和第 3 步:

那么您应该致电Path - Update 以获取附加数据

最后,再次调用Path - Update刷新数据

如果您不知道如何使用Path - Update 进行这些操作,请使用 fiddler 查看详细的请求信息,或者直接告诉我:)。以下是 Fiddler 捕获的请求截图:

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

【讨论】:

事实证明,我使用了另一个带有 blob.core.windows.net 的 URL。切换到dfs.core.windows.net 会引发错误400 - UnsupportedRestVersion。我错过了什么吗? @sschmeck,你用的是哪个版本的rest api(你可以用fiddler来弄明白)? 正如我在回答中提到的,如果不需要使用 ADLS Gen2 api,您可以选择使用更容易的 blob api:)。 谢谢@Ivan。我使用了由 Terraform 生成的 SAS 和 sv=2017-07-29。手动生成一个新的会产生sv=2019-10-10。它解决了UnsupportedRestVersion 的问题。

以上是关于由于缺少 x-ms-blob-type,在 ADLS Gen2 中创建路径失败?的主要内容,如果未能解决你的问题,请参考以下文章

删除函数和 ADL

IMAP 解析地址中的 ADL 字段是啥?

[架构之路-110]-《软考-系统架构设计师》-软件架构设计-3-架构描述语言ADL与UML

参数依赖查找(ADL,Argument-dependent lookup)

如何使用 fsspec+adlfs 加快从 adl:// 读取 CSV/Parquet 文件的速度?

c_cpp 基于ADL的SFINAE