сгенерированный sas URL-адрес blob-объекта отправляет неверный запрос 400 в Azure ocr api

#python #azure #azure-blob-storage #azure-sdk-python

#python #azure #azure-blob-storage #azure-sdk-python

Вопрос:

Я загрузил некоторые изображения в контейнер больших двоичных объектов Azure, чтобы мой Azure ocr api прочитал изображение и отправил обратно результат.

Я извлек список больших двоичных объектов из контейнера Azure с помощью

  blob_service.list_blobs().
  

Каждый из этих извлеченных больших двоичных объектов теперь передается методу общего доступа

 generate_blob_shared_access_signature(container_name='ocr-images',blob_name=blob.name,permission=PublicAccess.OFF,expiry='se=2015-04-30T02:23:26Z',start='st=2015-04-29T22:18:26Z')
  

результатом метода общего доступа является токен SAS, который затем передается

 blob_service.make_blob_url(container_name='ocr-images',blob_name=blob.name, sas_token=sas)
  

для генерации URL-адреса для каждого изображения

URL-адрес, сгенерированный при передаче в Azure ocr api, показывает ошибку

запросы.исключения.Ошибка клиента HTTPError: 400: неверный запрос URL: https://westeurope.api.cognitive.microsoft.com/vision/v2.0/ocr?language=unkamp;detectOrientation=false

Но когда URL-адрес генерируется вручную с портала Azure, он работает отлично. Может ли кто-нибудь помочь мне с этой проблемой?

Ответ №1:

Вы получаете эту ошибку, потому что вы используете метод generate_blob_shared_access_signature неправильно.

Существует ряд проблем со значениями, которые вы передаете этому методу.

Для permission вам необходимо указать одно из возможных значений BlobPermissions . Предполагая, что вы захотите прочитать содержимое blob-объекта, я бы рекомендовал вам использовать BlobPermissions.READ разрешение.

Обе ваши даты начала и истечения срока действия остались в прошлом. Кроме того, вам просто нужно указать значение даты и не включать st= и se= .

Пожалуйста, попробуйте использовать следующий код:

 generate_blob_shared_access_signature(container_name='ocr-images',blob_name=blob.name,permission=BlobPermissions.READ,expiry='2019-04-09',start='2019-04-08')
  

Комментарии:

1. Спасибо за ответ. Я использовал код, указанный вами выше, и теперь я не могу получить доступ к blob-объекту. Когда я открываю сгенерированный URL-адрес в браузере, он показывает ошибку 404

2. Пожалуйста, поделитесь URL-адресом SAS, который вы используете.

3. токен sas: st = 2019-04-09amp; se = 2019-04-10amp; sp = r amp; sv = 2018-03-28amp; sr= b amp; sig= tgkeuihuv3uifppmmmpbyjqahwwpugem6j8sz/Z2Iv7M= и URL-адрес sas: externalimages.blob.core.windows.net/ocr-images /…

4. Пожалуйста, убедитесь, что контейнер blob-объектов ocr-images существует в вашей учетной записи хранения. Когда я попытался получить доступ к URL-адресу, я получаю сообщение The specified container does not exist .

5. Я нашел ответ. Мне пришлось создать объект BlobSharedAccessSignature() и использовать метод generate_blob() для токена sas. токен sas не был создан с разрешениями, поэтому изображение не загружалось. любой, как это делается. Спасибо, что помогли мне

Ответ №2:

В случае ошибки 404 при создании URL из большого двоичного объекта SAS token требуется создать токен SAS из BlobSharedAccesssignature.

Вот мой код:

 from azure.storage.blob import BlockBlobService
from azure.storage.blob.models import BlobPermissions
from azure.storage.blob.sharedaccesssignature import BlobSharedAccessSignature

account_name = data_dict['blob_storage_account_name']
account_key = data_dict['blob_storage_account_key']
top_level_container_name = data_dict['blob_container_name']
blob_service = BlockBlobService(account_name, account_key)
blob_shared = BlobSharedAccessSignature(account_name, account_key)
  

Как только у вас есть объект из BlobSharedAccessSignature, вызовите метод generate_blob, который создаст токен sas для отдельного большого двоичного объекта из вашего контейнера

 sas = blob_shared.generate_blob(container_name=top_level_container_name, blob_name=blob.name,
                                     permission=BlobPermissions.READ, expiry='2019-04-10',
                                     start='2019-04-09')   

sas_url= 'https://' account_name '.blob.core.windows.net' '/' top_level_container_name '/' blob.name '?' sas