【发布时间】:2021-05-09 22:36:24
【问题描述】:
我有一个问题,Azure 存储 Blob 没有返回 206 Partial content for video files。
问题: 视频已完全下载(300mb 视频需要 20-40 秒)并且搜索栏无法正常工作。我正在使用 Laravel,仅当我尝试从 Azure Blob 存储中检索 .mp4 文件时才会出现此问题。当我将媒体文件存储在公共磁盘上时,它工作正常。
一位微软员工表示,将 x-ms-version 更改为 2011-01-18 或更高版本将解决我的问题。 LINK参与讨论:
微软有一篇关于设置 blob 服务属性的帖子:HERE
注意他们实现这一目标的示例:https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-service-properties#sample-request-and-response
我正在尝试像这样通过 Postman 发送请求:
PUT https://{account-name}.blob.core.windows.net/?restype=service&comp=properties
我搜索了错误并在 SO 上找到了这个问题: The MAC signature found in the HTTP request '...' is not the same as any computed signature
它有一个公认的答案,但我似乎不明白。我的请求/授权标头有问题吗?还是我需要采取不同的方法?
提前致谢!
我在 LARAVEL 中的代码:
$date = gmdate('D, d M Y H:i:s \G\M\T');
$account_name = "xyz";
$containername = "media";
$account_key = "access_key";
$canonicalizedHeaders = "x-ms-date:$date\nx-ms-version:2017-11-09";
$canonicalizedResource = "/$account_name/$containername\ncomp:list\nrestype:container";
$arraysign = array();
$arraysign[] = 'GET'; /*HTTP Verb*/
$arraysign[] = ''; /*Content-Encoding*/
$arraysign[] = ''; /*Content-Language*/
$arraysign[] = ''; /*Content-Length (include value when zero)*/
$arraysign[] = ''; /*Content-MD5*/
$arraysign[] = ''; /*Content-Type*/
$arraysign[] = ''; /*Date*/
$arraysign[] = ''; /*If-Modified-Since */
$arraysign[] = ''; /*If-Match*/
$arraysign[] = ''; /*If-None-Match*/
$arraysign[] = ''; /*If-Unmodified-Since*/
$arraysign[] = ''; /*Range*/
$arraysign[] = $canonicalizedHeaders; /*CanonicalizedHeaders*/
$arraysign[] = $canonicalizedResource; /*CanonicalizedResource*/
$stringtosign = implode("\n", $arraysign);
$signature = 'SharedKey' . ' ' . $account_name . ':' . base64_encode(hash_hmac('sha256', $stringtosign, base64_decode($account_key), true));
$endpoint = 'https://' . $account_name . '.blob.core.windows.net';
$url = $endpoint . '/' . $containername . '?restype=container';
$headers = [
"x-ms-date:{$date}",
'x-ms-version:2017-11-09',
'Accept:application/json;odata=nometadata',
"Authorization:{$signature}"
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
echo curl_error($ch);
curl_close($ch);
echo '<pre>';
print_r($response);
【问题讨论】:
-
你把存储密钥作为共享密钥放在请求头中了吗?
-
嗨@BowmanZhu,我正在使用来自门户的访问密钥。我不确定访问密钥是否等同于“存储”密钥?另外,有没有办法在邮递员中实现这一点?
-
REST API 不应该使用这个。 'SharedKey:' 之后的值是来自标头和存储密钥的签名(这只能从代码中生成)。仅仅使用postman是无法得到这个值的,需要使用代码生成,然后粘贴到'SharedKey'之后。
-
生成很麻烦,而且每个REST API都不一样,我可以帮你找到相关的东西(如果你需要的话)。 :)
-
那会很有帮助。我是否需要 Azure 门户中访问密钥的密钥和连接字符串?
标签: azure api postman azure-storage azure-blob-storage