1

我已将一些图像上传到 azure blob 容器,以便我的 azure ocr api 读取图像并发回输出。

我已经使用从 azure 容器中检索了 blob 列表

 blob_service.list_blobs().

现在将这些检索到的 blob 中的每一个都提供给共享访问方法

generate_blob_shared_access_signature(container_name='ocr-images',blob_name=blob.name,permission=PublicAccess.OFF,expiry='se=2015-04-30T02%3A23%3A26Z',start='st=2015-04-29T22%3A18%3A26Z')

共享访问方法的输出是一个 SAS 令牌,然后将其提供给

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

为每个图像生成 url

传递给 Azure ocr api 时生成的 URL 显示错误

requests.exceptions.HTTPError:400 客户端错误:对 url 的错误请求:https ://westeurope.api.cognitive.microsoft.com/vision/v2.0/ocr?language=unk&detectOrientation=false

但是当从 azure 门户手动生成 url 时,它可以完美运行。有人可以帮我解决这个问题吗?

4

2 回答 2

1

您收到此错误是因为您错误地使用了该方法generate_blob_shared_access_signature

您传递给此方法的值存在许多问题。

对于permission,您需要提供 的可能值之一BlobPermissions。假设您想阅读 blob 内容,我建议您使用BlobPermissions.READ权限。

您的开始日期和到期日期都在过去。此外,您只需要指定日期值而不包括st=and 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')
于 2019-04-08T15:02:34.697 回答
0

如果从 SAS 令牌 blob 创建 url 时出现 404 错误,则需要从 BlobSharedAccesssignature 创建一个 SAS 令牌。

这是我的代码:

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 方法,该方法为容器中的单个 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
于 2019-04-09T12:53:13.227 回答