返回

轻松上传 Blob 图像到 Azure:使用 SAS 令牌的详细指南

php

使用 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);
}

常见问题解答

  1. 我的 SAS 签名无效。

确保 SAS 签名是有效的,并且为 Blob 授予了正确的权限。

  1. 我收到了 403 禁止访问错误。

检查 Blob 命名是否正确,它必须存在于容器中。

  1. 我的 URL 不包含正确的 SAS 参数。

仔细检查 URL,确保它包含所有必需的 SAS 参数。

  1. 我的 PHP 代码中有语法错误。

仔细检查你的代码语法,确保它正确无误。

  1. 我无法验证图像是否已上传。

使用 Azure 存储资源管理器或其他工具验证 Blob 中图像的存在。

结论

遵循本文概述的步骤,你可以使用 SAS 令牌轻松有效地将 Blob 图像上传到 Azure 储存库。通过利用 SAS 令牌的强大功能,你可以安全地管理对敏感数据的访问,同时保持出色的性能和可靠性。无论你是经验丰富的程序员还是刚开始接触 Azure,本文都提供了有价值的指导和实践代码示例,帮助你完成任务。