如何为存储在 Blob 容器中的 excel 文件生成 Blob SAS URL

Posted

技术标签:

【中文标题】如何为存储在 Blob 容器中的 excel 文件生成 Blob SAS URL【英文标题】:How to Generate Blob SAS URL for a excel file stored in Blob Container 【发布时间】:2021-08-31 22:22:57 【问题描述】:

我正在尝试为 excel 文件生成 Blob SAS URL,以读取其数据框中的数据。 我正在使用下面的 python 代码,它在将 URL 值传递给 read_excel 函数时引发错误 “HTTPError:服务器无法验证请求。确保 Authorization 标头的值格式正确,包括签名。”

代码:

    from azure.storage.blob import generate_blob_sas
    from azure.storage.blob import BlobServiceClient, ResourceTypes, AccountSasPermissions
    from datetime import datetime, timedelta,date
    import pandas as pd
    
    blob_name=<Blobname>
    account_name=<accountname>
    account_key=<accountkey>
    container_name=<blobname>
    
    sas_blob = generate_blob_sas(account_name=account_name, 
                              container_name=container_name,
                                blob_name=blob_name,
                                account_key=account_key,
                                resource_types=ResourceTypes(object=True),
                                permission=AccountSasPermissions(read=True),
                               expiry=datetime.utcnow() + timedelta(hours=1))
    
    blob = generate_blob_sas(account_name,account_key, container_name, blob_name,sas_blob)
    blob_service_client = BlobServiceClient(account_url="https://<account_name>.blob.core.windows.net", credential=sas_blob)
    url = 'https://'+account_name+'.blob.core.windows.net/'+container_name+'/'+blob_name+'?'+sas_blob
    print(url)
    df=pd.read_excel(url, sheet_name='test',usecols=(cols),header=6)

错误 失败的 C:\WPy64-3800\python-3.8.0.amd64\lib\site-packages\azure\storage\blob\baseblobservice.py:1009: SyntaxWarning: "is not" with a literal。你的意思是“!=”?如果lease_duration 不是-1 并且 \C:\WPy64-3800\python-3.8.0.amd64\lib\site-packages\azure\storage\blob\baseblobservice.py:2660: SyntaxWarning: "is not" with a literal .你的意思是“!=”?如果lease_duration 不是-1 并且 \C:\WPy64-3800\python-3.8.0.amd64\lib\site-packages\azure\storage\common_connection.py:82: SyntaxWarning: "is" with a literal。你的意思是“==”吗? self.protocol = self.protocol if parsed_url.scheme is '' else parsed_url.schemeTraceback(最近一次调用最后):文件“C:\Temp\rid04ztb.tl0\005b3440-f226-432b-b554-d625411fdb58”,第 26 行,在 df=pd.read_excel(url, sheet_name='test',usecols=(cols),header=6) 文件 "C:\WPy64-3800\python-3.8.0.amd64\lib\site-packages\pandas\ util_decorators.py”,第 299 行,在包装器中返回 func(*args, **kwargs) 文件“C:\WPy64-3800\python-3.8.0.amd64\lib\site-packages\pandas\io\excel_base.py ",第 336 行,在 read_excel io = ExcelFile(io, storage_options=storage_options, engine=engine) 文件 "C:\WPy64-3800\python-3.8.0.amd64\lib\site-packages\pandas\io\excel_base. py",第 1071 行,在 init ext = inspect_excel_format( 文件 "C:\WPy64-3800\python-3.8.0.amd64\lib\site-packages\pandas\io\excel_base.py" ,第 949 行,inspect_excel_format 和 get_handle( 文件 "C:\WPy64-3800\python-3.8.0.amd64\lib\site-packages\pandas\io\common.py",第 558 行,在 get_handle ioargs = _get_filepath_or _buffer(文件“C:\WPy64-3800\python-3.8.0.amd64\lib\site-packages\pandas\io\common.py”,第 289 行,在 _get_filepath_or_buffer req = urlopen(filepath_or_buffer) 文件“C:\ WPy64-3800\python-3.8.0.amd64\lib\site-packages\pandas\io\common.py”,第 195 行,在 urlopen 返回 urllib.request.urlopen(*args, **kwargs) 文件“C: \WPy64-3800\python-3.8.0.amd64\lib\urllib\request.py”,第 222 行,在 urlopen 返回 opener.open(url, data, timeout) 文件“C:\WPy64-3800\python-3.8 .0.amd64\lib\urllib\request.py”,第 531 行,打开响应 = meth(req, response) 文件“C:\WPy64-3800\python-3.8.0.amd64\lib\urllib\request. py",第 640 行,在 http_response response = self.parent.error( 文件 "C:\WPy64-3800\python-3.8.0.amd64\lib\urllib\request.py",第 569 行,错误返回 self。 _call_chain(*args) 文件“C:\WPy64-3800\python-3.8.0.amd64\lib\urllib\request.py”,第 502 行,在 _call_chain 结果 = func(*args) 文件“C:\WPy64- 3800\python-3.8.0.amd64\lib\urllib\request.py",第 649 行,在 http_error_d默认引发 HTTPError(req.full_url, code, msg, hdrs, fp)urllib.error.HTTPError: HTTP Error 403: Server failed to authenticate the request。确保 Authorization 标头的值格式正确,包括签名。

任何帮助表示赞赏。提前致谢。

【问题讨论】:

【参考方案1】:

我相信您收到此错误是因为您将服务 SAS 与帐户 SAS 混合使用。你的generate_blob_sas 方法中不需要resource_typespermission 类型也应该是BlobSasPermissions

请尝试以下代码:

from azure.storage.blob import generate_blob_sas
from azure.storage.blob import BlobServiceClient, ResourceTypes, BlobSasPermissions
from datetime import datetime, timedelta,date
import pandas as pd

blob_name=<Blobname>
account_name=<accountname>
account_key=<accountkey>
container_name=<blobname>

sas_blob = generate_blob_sas(account_name=account_name, 
                            container_name=container_name,
                            blob_name=blob_name,
                            account_key=account_key,
                            permission=BlobSasPermissions(read=True),
                            expiry=datetime.utcnow() + timedelta(hours=1))

【讨论】:

您提供的使用代码出现以下错误。如何生成用户授权密钥?前提是我已经有帐户密钥。失败的文件“C:\Temp\kzpkzmbj.1sf\005b3440-f226-432b-b554-d625411fdb58”,第 17 行,blob generate_blob_sas(account_name,account_key, container_name, blob_name) python-3.8.0.amd64\lib\sitepackages\azure\storage\blob_shared_access_signature.py”,第 577 行,在 generate_blob_sas 中引发 ValueError(“必须提供 user_delegation_key 或 account_key。”)ValueError:必须提供 user_delegation_key 或 account_key。

以上是关于如何为存储在 Blob 容器中的 excel 文件生成 Blob SAS URL的主要内容,如果未能解决你的问题,请参考以下文章

需要通过oledb连接从azure存储blob容器中读取excel文件

如何在 Python 中将 Azure Blob 文件 CSV 转换为 Excel

在 Startup.cs 中初始化 Blob 存储

如何为 Azure 上的 Node.js Api 应用启用 BLOB 日志记录?

Azure Blob 容器备份和恢复

天蓝色 blob 存储中的 XLSX 文件作为 zip 文件下载