Python: загрузка пакета в Azure с использованием SAS URI - PullRequest
0 голосов
/ 10 июля 2019

Я использую API-интерфейс аппаратной панели Microsoft для автоматизации отправки пакета (.CAB) на подпись. Я выполнил шаги в этой документации: https://docs.microsoft.com/en-us/windows-hardware/drivers/dashboard/create-a-new-submission-for-a-product

Ответ нового представления содержит URI SAS (Shared Access Signature) вот так: (изменил sig и accnt_name для безопасности)

'' 'https://accnt_name.blob.core.windows.net/scsjc/cexxxxxxxxxx?sv=2017-04-17&sr=b&sig=xxxxxxxxxxxxxx&se=2019-07-10T18:15:58Z&sp=rwl&rscd=attachment%3B имя файла% 3Dinitial_xxxxxxxx.cab' ''

Мне нужно использовать этот SAS URI для загрузки по пакетам в хранилище BLOB-объектов Azure. Примеры в документации показывают C # или .NET следующим образом:

string sasUrl = 
"https://productingestionbin1.blob.core.windows.net/ingestion/26920f66- 
 b592-4439-9a9d-fb0f014902ec?sv=2014-02-
 14&sr=b&sig=usAN0kNFNnYE2tGQBI%2BARQWejX1Guiz7hdFtRhyK%2Bog%3D&se=2016- 
 06-17T20:45:51Z&sp=rwl";
 Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob blockBob =
 new Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob(new 
 System.Uri(sasUrl));
 await blockBob.UploadFromStreamAsync(stream);

Я хочу использовать SAS URI, полученный из ресурса отправки JSON Response, для загрузки пакета.

Эта ссылка Загрузка файла из AZURE BLOB-КОНТЕЙНЕРА с использованием SAS URI в PYTHON предполагает, что в python нет эквивалентного метода, и можно использовать BlockBlobService.

from azure.storage.blob import BlockBlobService

 blobservice = BlockBlobService("storage_account",sas_token="?sv=2018-03- 
 28&ss=bfqt&srt=sco&sp=rwdlacup&se=2019-04-24T10:01:58Z&st=2019-04- 
 23T02:01:58Z&spr=https&sig=xxxxxxxxx")

 blobservice.create_blob_from_path(container_name, local_file_name, 
 full_path_to_file)

Однако я не уверен в том, что такое имя storage_account и имя контейнера из SAS URI, полученного из ресурса отправки.

Также я создал отдельную учетную запись хранения Azure и добавил новый контейнер, BLOB-объект в нем. Я попытался передать новое имя учетной записи контейнера и хранилища с помощью маркера доступа SAS из SAS URI (полученного из представления аппаратного API-интерфейса JSON-ответа JSON), но всегда получаю значение ниже ОШИБКА

''» AzureHttpError: Серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись. Код ошибки: AuthenticationFailed AuthenticationFailed Серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись. RequestID: 5463b7d2-901e-0068-6994-36782e000000 Время: 2019-07-09T20: 23: 04.5760736ZПодпись не совпадает. Используемая строка для подписи: rwl

2019-07-10T18: 15: 58Z /blob/evcertautomation/ev2/initial_1152921504628106590.cab

2017-04-17

крепление; имя файла = initial_1152921504628106563.cab «»» Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Если у вас есть бланк SAS URI, как вы публикуете ниже, вы можете легко загрузить файл в блоб в Python с помощью requests.

https://accnt_name.blob.core.windows.net/scsjc/cexxxxxxxxxx?sv=2017-04-17&sr=b&sig=xxxxxxxxxxxxxx&se=2019-07-10T18:15:58Z&sp=rwl&rscd=attachment%3B filename%3Dinitial_xxxxxxxx.cab

Сначала вы должныдолжны проверять значения параметров se и sp.Параметр se означает время истечения URI-адреса SAS большого двоичного объекта, а параметр sp означает разрешение операции для URL-адреса SAS большого двоичного объекта, например w для разрешения записи BLOB-объектов

Так же для URL-адреса SAS BLOB-объектавыше, у вас есть разрешение на запись в BLOB-файл для загрузки файла в этот BLOB-объект до времени 2019-07-10T18:15:58Z.

. Вот мой пример кода для загрузки с помощью BLOB-объекта sas uri.

import requests

blob_sas_uri = '<your blob sas uri which must includes `sp=w` and do the write operation before `se`>'

local_file_name = '<your local file name>'

headers = {
    'x-ms-blob-type': 'BlockBlob'
}

data = open(local_file_name).read()

r = requests.put(blob_sas_uri, headers=headers, data=data)
print(r.status_code)

Если вы видите результат 201, он работает нормально и успешно загружается.

Для справки есть аналогичный официальный пример Example: Upload a Blob using a Container’s Shared Access Signature, который использует разрешение широкого контейнера.

0 голосов
/ 10 июля 2019

Согласно предоставленному вами SAS URI: '' 'https://accnt_name.blob.core.windows.net/scsjc/cexxxxxxxxxx?sv=2017-04-17&sr=b&sig=xxxxxxxxxxxxxx&se=2019-07-10T18:15:58Z&sp=rwl&rscd=attachment%3B имя файла% 3Dinitial_xxxxxxxx.cab' ''

Имя учетной записи должно быть accnt_name , контейнер должен быть scsjc .

Итак, ваш код должен выглядеть следующим образом:

 from azure.storage.blob import BlockBlobService

storage_account ="accnt_name"
token="?sv=2018-03- 
 28&ss=bfqt&srt=sco&sp=rwdlacup&se=2019-04-24T10:01:58Z&st=2019-04- 
 23T02:01:58Z&spr=https&sig=xxxxxxxxx"

container="scsjc"

 blobservice = BlockBlobService(storage_account,sas_token=token)

 blobservice.create_blob_from_path(container, local_file_name, 
 full_path_to_file)
...