轻松上传 Blob 图像到 Azure:使用 SAS 令牌的详细指南
2024-03-23 06:08:12
使用 SAS 令牌将 Blob 图像上传到 Azure
简介
图像存储是当今数字世界中至关重要的一个方面,因为它为数据保存、管理和共享提供了便利。利用 Azure 储存库的可靠性和可扩展性,你可以安全有效地存储和管理图像文件。本文将重点介绍如何使用 SAS 令牌将 Blob 图像上传到 Azure,提供分步指南和深入的见解,帮助你完成任务。
先决条件
踏上将 Blob 图像上传到 Azure 的旅程之前,确保已满足以下先决条件:
- Azure 存储帐户
- SAS 令牌
- PHP 开发环境
第 1 步:生成 SAS 令牌
SAS(共享访问签名)令牌是授予对 Azure 存储资源有限访问权限的强大工具。前往 Azure 门户或使用 Azure 存储 SDK 生成 SAS 令牌,确保为 Blob 授予所需的权限,如读取和写入。
第 2 步:获取访问密钥
通过 getAccessKey()
函数获取 Azure 存储帐户的访问密钥,它将用于创建 SAS 签名。
第 3 步:创建 SAS 签名
使用 getSASForBlob()
函数创建 SAS 签名,该签名将用于向 Blob 授予访问权限。指定正确的参数,包括权限、资源类型和到期时间。
第 4 步:上传 Blob
借助 uploadBlob()
函数,你可以将 Blob 图像上传到 Azure 储存库。提供所需信息,如文件路径、存储帐户名称、容器名称和 Blob 名称。此外,请务必包含之前创建的 SAS 签名。
第 5 步:验证上传
成功上传后,使用 Azure 存储资源管理器或其他工具验证图像是否已安全存储在 Blob 中。这将确保文件完整性并提供安心。
代码示例
为了增强你的理解,这里提供了一个 PHP 代码示例,展示了如何上传 Blob 图像:
// 获取访问密钥
function getAccessKey()
{
return 'YOUR_ACCESS_KEY';
}
// 创建 SAS 签名
function getSASForBlob($accountName, $container, $blob, $resourceType, $permissions, $expiry)
{
$key = getAccessKey();
// 创建签名
$str2sign = implode("\n", array(
$permissions,
'',
$expiry,
'/' . $accountName . '/' . $container . '/' . $blob,
'',
'2014-02-14', // API 版本
'',
'',
'',
'',
''
));
return base64_encode(
hash_hmac('sha256', urldecode(utf8_encode($str2sign)), base64_decode($key), true)
);
}
// 上传 Blob
function uploadBlob($filepath, $storageAccountname, $containerName, $blobName, $signature)
{
$accesskey = getAccessKey();
$Date = gmdate('D, d M Y H:i:s \G\M\T');
$fileLen = filesize($filepath);
$URL = "https://$storageAccountname.blob.core.windows.net/$containerName/$blobName";
$expiry = '';
$resourceType = 'b';
$permissions = 'r';
$URL .= "?se=$expiry&sr=$resourceType&sp=$permissions&sig=" . urlencode($signature) . '&sv=2014-02-14';
$headerResource = "x-ms-blob-cache-control:max-age=3600\nx-ms-blob-type:BlockBlob\nx-ms-date:$Date\nx-ms-version:2017-11-09";
$urlResource = "/$storageAccountname/$containerName/$blobName";
$extUsed = explode(".", $filepath)[3];
$arraysign = array(
'PUT', /*HTTP Verb*/
'', /*Content-Encoding*/
'', /*Content-Language*/
$fileLen, /*Content-Length (include value when zero)*/
'', /*Content-MD5*/
'image/' . $extUsed, /*Content-Type*/
'', /*Date*/
'', /*If-Modified-Since */
'', /*If-Match*/
'', /*If-None-Match*/
'', /*If-Unmodified-Since*/
'', /*Range*/
$headerResource, /*CanonicalizedHeaders*/
$urlResource /*CanonicalizedResource*/
);
$str2sign = implode("\n", $arraysign);
$sig = base64_encode(hash_hmac('sha256', urldecode(utf8_encode($str2sign)), base64_decode($accesskey), true));
$authHeader = "SharedKey $storageAccountname:$sig";
$headers = [
'Authorization: ' . $authHeader,
'x-ms-blob-cache-control: max-age=3600',
'x-ms-blob-type: BlockBlob',
'x-ms-date: ' . $Date,
'x-ms-version: 2017-11-09',
'Content-Type: image/' . $extUsed,
'Content-Length: ' . $fileLen
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_INFILE, fopen($filepath, "r"));
curl_setopt($ch, CURLOPT_INFILESIZE, $fileLen);
curl_setopt($ch, CURLOPT_UPLOAD, true);
$result = curl_exec($ch);
curl_close($ch);
return array($URL, $filepath, $result, $blobName, $urlResource, $accesskey);
}
常见问题解答
- 我的 SAS 签名无效。
确保 SAS 签名是有效的,并且为 Blob 授予了正确的权限。
- 我收到了 403 禁止访问错误。
检查 Blob 命名是否正确,它必须存在于容器中。
- 我的 URL 不包含正确的 SAS 参数。
仔细检查 URL,确保它包含所有必需的 SAS 参数。
- 我的 PHP 代码中有语法错误。
仔细检查你的代码语法,确保它正确无误。
- 我无法验证图像是否已上传。
使用 Azure 存储资源管理器或其他工具验证 Blob 中图像的存在。
结论
遵循本文概述的步骤,你可以使用 SAS 令牌轻松有效地将 Blob 图像上传到 Azure 储存库。通过利用 SAS 令牌的强大功能,你可以安全地管理对敏感数据的访问,同时保持出色的性能和可靠性。无论你是经验丰富的程序员还是刚开始接触 Azure,本文都提供了有价值的指导和实践代码示例,帮助你完成任务。