Создать путь в ADLS Gen2 не удается из-за отсутствия типа x-ms-blob?

Я создал учетную запись хранения Azure с помощью Azure Data Lake Storage 2-го поколения. Я хочу загрузить файл с помощью REST API. Хотя использование авторизации с общими ключами работает нормально, у меня возникают проблемы с использованием учетной записи 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>

Оказалось, что отсутствующий заголовок необходим для создания большого двоичного объекта в хранилище BLOB-объектов. Поскольку ADLS Gen2 поддерживает оба API и оба обеспечивают аналогичную операцию, он делегирует запрос неправильному.

Есть ли способ создать путь с помощью операции PUT с SAS в ADLS Gen2 API?

1 ответ

Решение

Да, вы можете создать путь (файл в этом примере), используя операцию PUT с SAS в ADLS Gen2 API. Но вам нужно сделать 3 шага: создать пустой файл / добавить данные в пустой файл / сбросить данные.

Шаг 1: после генерации токена sas вам необходимо вызвать Path - Create, чтобы создать файл в ADLS Gen2. Примечание: файл здесь должен быть пустым, это означает, что в заголовке запросаContent-Length должно быть 0.

URL-адрес запроса выглядит так:

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

Здесь я протестировал его с помощью почтальона, он работает без проблем. Пустой файл можно создать в ADLS Gen2 на портале Azure:

Шаг 2 и Шаг 3:

тогда вы должны вызвать Path - Update для добавления данных.

наконец, снова вызовите Path - Update для сброса данных.

Если вы не знаете, как использовать Path - Update для этой операции, воспользуйтесь скриптом, чтобы просмотреть подробную информацию о запросе, или просто дайте мне знать:). Вот скриншот запроса, захваченного Fiddler:

Кстати, я предлагаю вам напрямую использовать API Put Blob с токеном sas (но вам нужно указатьx-ms-blob-type в заголовке запроса), что представляет собой всего лишь один шаг как для создания файла, так и для загрузки содержимого.