#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