Azure Blob Storage REST API问题:Curl+SAS令牌无法下载容器内Blob
Azure Blob Storage:容器SAS令牌无法下载Blob(可正常列出)
问题概述
使用Azure Blob Storage REST API可正常完成连接资源、列出容器、生成容器SAS令牌及列出容器内Blob等操作,但通过curl使用容器SAS令牌下载Blob时,先后返回ResourceNotFound和BlobNotFound错误,尽管已通过list命令确认Blob存在。
初始命令与错误
初始curl命令
curl -X GET "https://dat3473spa01cfeMtest.blob.core.windows.net/90480397-91234697-218-test-dir01/3c6a1ba9-2168-4171-8311-813e3762108b.txt&sv=2019-02-02&sr=c&sig=QlSozpknsTcR4frUK08%2FrcGaUGY893GzFN1Lyhl74Ao%3D&se=2024-10-24T07%3A50%3A11Z&sp=racwdl"
参数说明
- Blob服务URL:
https://dat3473spa01cfeMtest.blob.core.windows.net - 容器名称:
90480397-91234697-218-test-dir01 - Blob名称:
3c6a1ba9-2168-4171-8311-813e3762108b.txt - 容器SAS令牌:
?sv=2019-02-02&sr=c&sig=QlSozpknsTcR4frUK08%2FrcGaUGY893GzFN1Lyhl74Ao%3D&se=2024-10-24T07%3A50%3A11Z&sp=racwdl
初始错误信息
<?xml version="1.0" encoding="utf-8"?> <Error> <Code>ResourceNotFound</Code> <Message>The specified resource does not exist. RequestId:8feff5f9-001e-006d-5b18-260db0000000 Time:2024-10-24T13:28:25.9692381Z</Message> </Error>
调整后的命令与错误
# 错误添加了&?分隔符 curl -X GET "https://dat3473spa01cfeMtest.blob.core.windows.net/90480397-91234697-218-test-dir01/3c6a1ba9-2168-4171-8311-813e3762108b.txt&?sv=2019-02-02&sr=c&sig=QlSozpknsTcR4frUK08%2FrcGaUGY893GzFN1Lyhl74Ao%3D&se=2024-10-24T07%3A50%3A11Z&sp=racwdl" # 修正为?开头,但仍报错 curl -X GET "https://dat3473spa01cfeMtest.blob.core.windows.net/90480397-91234697-218-test-dir01/3c6a1ba9-2168-4171-8311-813e3762108b.txt?sv=2019-02-02&sr=c&sig=QlSozpknsTcR4frUK08%2FrcGaUGY893GzFN1Lyhl74Ao%3D&se=2024-10-24T07%3A50%3A11Z&sp=racwdl"
返回错误
<?xml version="1.0" encoding="utf-8"?> <Error> <Code>BlobNotFound</Code> <Message>The specified blob does not exist. RequestId:4978f267-601e-0043-3419-26bc10000000 Time:2024-10-24T13:32:22.1650304Z</Message> </Error>
Blob存在验证
列出Blob的命令
curl -X GET "https://dat3473spa01cfeMtest.blob.core.windows.net/90480397-91234697-218-test-dir01?restype=container&comp=list&sv=2019-02-02&sr=c&sig=QlSozpknsTcR4frUK08%2FrcGaUGY893GzFN1Lyhl74Ao%3D&se=2024-10-24T07%3A50%3A11Z&sp=racwdl"
返回结果
90480397-91234697-218-test-dir01/3c6a1ba9-2168-4171-8311-813e3762108b.txt
解决方案
1. 修正URL查询参数分隔符
初始命令中,SAS令牌以&开头,这是错误的。URL查询参数必须以?开头,&仅用于分隔多个参数。这是导致ResourceNotFound错误的直接原因。
2. 匹配Blob的实际名称
从list命令的返回结果可以看出,Blob的完整名称包含容器前缀:90480397-91234697-218-test-dir01/3c6a1ba9-2168-4171-8311-813e3762108b.txt,而非仅文件名。这说明上传时可能误将容器名作为Blob路径的一部分,因此下载URL中的Blob路径需要使用完整名称。
正确的curl命令
curl -X GET "https://dat3473spa01cfeMtest.blob.core.windows.net/90480397-91234697-218-test-dir01/90480397-91234697-218-test-dir01/3c6a1ba9-2168-4171-8311-813e3762108b.txt?sv=2019-02-02&sr=c&sig=QlSozpknsTcR4frUK08%2FrcGaUGY893GzFN1Lyhl74Ao%3D&se=2024-10-24T07%3A50%3A11Z&sp=racwdl"
额外验证方法
若仍有问题,可使用Azure CLI验证Blob是否存在及权限:
az storage blob download --account-name dat3473spa01cfeMtest --container-name 90480397-91234697-218-test-dir01 --name "90480397-91234697-218-test-dir01/3c6a1ba9-2168-4171-8311-813e3762108b.txt" --sas-token "?sv=2019-02-02&sr=c&sig=QlSozpknsTcR4frUK08%2FrcGaUGY893GzFN1Lyhl74Ao%3D&se=2024-10-24T07%3A50%3A11Z&sp=racwdl"
内容的提问来源于stack exchange,提问作者Chazg76
相关产品推荐
相关产品推荐

