如何通过Python中的URL下载Azure Blob存储文件?

时间:2019-06-26 09:39:23

标签: python azure blob

我正在尝试从存储帐户下载Azure Blob存储文件,为此,我已经检查了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.

我已经仔细检查了网址是否正确。这可能与未传递我的订阅密钥或有关存储帐户的任何其他信息有关吗?

有什么主意吗?

4 个答案:

答案 0 :(得分:0)

要直接使用url下载,应将blob放在公共容器中,或将其放入私有容器中,然后为blob生成一个sas令牌(网址看起来像:https://xxx.blob.core.windows.net/aa1/0116.txt?sp=r&st=2019-06-26T09:47:04Z&se=2019-06-26xxxxx)。

我使用包含sas令牌的网址测试您的代码,可以将其下载。

测试结果:

enter image description here

如何为Blob生成sas令牌:

enter image description here

答案 1 :(得分:0)

要解决此问题,我需要做的就是将Blob存储访问级别更改为Blob(仅对blob进行匿名读取访问)。一旦完成,它将起作用。

enter image description here

答案 2 :(得分:0)

实际上,您可以在适用于Python的Azure存储SDK中生成带有sas令牌的blob URL,以供直接访问,如下面的示例代码所示。

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)

答案 3 :(得分:0)

截至2019年12月26日,我无法从Azure云存储中导入BaseBlobService。 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}"