Я пытаюсь загрузить файл хранилища BLOB-объектов Azure из своей учетной записи хранения, для этого я проверил, что такое URL, и делаю следующее:

with urllib.request.urlopen("<url_file>") as resp:
    img = np.asarray(bytearray(resp.read()), dtype="uint8")

Но я получаю следующую ошибку:

urllib.error.HTTPError: HTTP Error 404: The specified resource does not exist.

Я дважды проверил, что URL-адрес правильный. Может ли это быть связано с тем, что вы не передали ключи моей подписки или любую другую информацию об учетной записи хранения?

Есть идеи?

1
Marisa 26 Июн 2019 в 12:39

3 ответа

На самом деле, вы можете создать URL-адрес большого двоичного объекта с токеном sas в Azure Storage SDK для Python для прямого доступа, как показано в моем примере кода ниже.

from azure.storage.blob.baseblobservice import BaseBlobService
from azure.storage.blob import BlobPermissions
from datetime import datetime, timedelta

account_name = '<account name>'
account_key = '<account key>'
container_name = '<container name>'
blob_name = '<blob name>'

url = f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}"

service = BaseBlobService(account_name=account_name, account_key=account_key)
token = service.generate_blob_shared_access_signature(container_name, blob_name, permission=BlobPermissions.READ, expiry=datetime.utcnow() + timedelta(hours=1),)

url_with_sas = f"{url}?{token}"

Затем,

import urllib
import numpy as np

req = urllib.urlopen(url_with_sas)
img = np.asarray(bytearray(req.read()), dtype=np.uint8)
1
Peter Pan 26 Июн 2019 в 10:18

По состоянию на 26 декабря 2019 года я не могу импортировать BaseBlobService из облачного хранилища Azure. Ни один из BlobPermissions, generate_blob_shared_access_signature не работал для меня. Ниже я кое-что использовал, и это сработало в моем случае, и надеюсь, что это поможет

from azure.storage.blob import generate_blob_sas, AccountSasPermissions

def scan_product():

    account_name=<account_name>
    container_name=<container_name>
    blob_name=<blob_name>
    account_key=<account_key>
    url = f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}"
    sas_token = generate_blob_sas(
        account_name=account_name,
        account_key=account_key,
        container_name=container_name,
        blob_name=blob_name,
        permission=AccountSasPermissions(read=True),
        expiry=datetime.utcnow() + timedelta(hours=1)
    )

    url_with_sas = f"{url}?{sas_token}"
0
Hemachandra Ghanta 26 Дек 2019 в 22:24

Чтобы решить эту проблему, все, что мне нужно было сделать, это изменить уровень доступа к хранилищу BLOB-объектов на Blob (анонимный доступ на чтение только для BLOB-объектов). Как только это будет сделано, это будет работать.

enter image description here

1
Marisa 26 Июн 2019 в 10:06