快速入门:适用于 C++ 的 Azure Blob 存储客户端库 v12

适用于 C++ 的 Azure Blob 存储客户端库 v12 入门。 Azure Blob 存储是 Microsoft 提供的适用于云的对象存储解决方案。 请按照步骤操作,安装程序包并试用基本任务的示例代码。 Blob 存储最适合存储巨量的非结构化数据。

使用适用于 C++ 的 Azure Blob 存储客户端库 v12 完成以下操作:

  • 创建容器
  • 将 blob 上传到 Azure 存储
  • 列出容器中所有的 blob
  • 将 blob 下载到本地计算机
  • 删除容器

资源:

先决条件

设置

本部分逐步指导如何准备一个项目,使其与适用于 C++ 的 Azure Blob 存储客户端库 v12 配合使用。

安装包

vcpkg install 命令将安装适用于 C++ 的 Azure 存储 Blob SDK 和所需的依赖项:

vcpkg.exe install azure-storage-blobs-cpp:x64-windows

有关详细信息,请访问 GitHub 以获取并生成适用于 C++ 的 Azure SDK

创建项目

在 Visual Studio 中创建 C++ Windows 控制台应用程序“BlobQuickstartV12”。

用于配置新的 C++ Windows 控制台应用的 Visual Studio 对话框

从 Azure 门户复制凭据

当示例应用程序向 Azure 存储发出请求时,必须对其进行授权。 若要对请求进行授权,请将存储帐户凭据以连接字符串形式添加到应用程序中。 若要查看存储帐户凭据,请按以下步骤操作:

  1. 登录 Azure 门户

  2. 找到自己的存储帐户。

  3. 在存储帐户菜单窗格中的“安全性 + 网络”下,选择“访问密钥” 。 在这里,可以查看帐户访问密钥以及每个密钥的完整连接字符串。

    屏幕截图显示了访问密钥设置在 Azure 门户中的位置

  4. 在“访问密钥”窗格中,选择“显示密钥” 。

  5. 在“key1”部分,找到“连接字符串”值 。 选择“复制到剪贴板”图标来复制该连接字符串。 在下一部分,需将此连接字符串值添加到某个环境变量。

    显示如何从 Azure 门户复制连接字符串的屏幕截图

配置存储连接字符串

在复制连接字符串后,请将其写入到运行该应用程序的本地计算机上的新环境变量。 若要设置环境变量,请打开控制台窗口,并遵照适用于操作系统的说明。 将 <yourconnectionstring> 替换为实际的连接字符串。

Windows

setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"

在 Windows 中添加环境变量后,必须启动命令窗口的新实例。

Linux

export AZURE_STORAGE_CONNECTION_STRING="<yourconnectionstring>"

macOS

export AZURE_STORAGE_CONNECTION_STRING="<yourconnectionstring>"

重新启动程序

添加环境变量后,重启需要读取环境变量的任何正在运行的程序。 例如,先重启开发环境或编辑器,然后再继续操作。

对象模型

Azure Blob 存储最适合存储巨量的非结构化数据。 非结构化数据是不遵循特定数据模型或定义的数据(如文本或二进制数据)。 Blob 存储提供了三种类型的资源:

  • 存储帐户
  • 存储帐户中的容器
  • 容器中的 blob

以下图示显示了这些资源之间的关系。

Blob 存储体系结构的图示

使用以下 C++ 类与这些资源进行交互:

  • BlobServiceClientBlobServiceClient 类可用于操纵 Azure 存储资源和 blob 容器。
  • BlobContainerClientBlobContainerClient 类可用于操纵 Azure 存储容器及其 blob。
  • BlobClientBlobClient 类可用于操纵 Azure 存储 blob。 这是所有专用 blob 类的基类。
  • BlockBlobClientBlockBlobClient 类可用于操纵 Azure 存储块 blob。

代码示例

这些示例代码片段演示如何使用适用于 C++ 的 Azure Blob 存储客户端库执行以下任务:

添加包含文件

从项目目录中执行以下操作:

  1. 在 Visual Studio 中打开 BlobQuickstartV12.sln 解决方案文件
  2. 在 Visual Studio 中,打开 BlobQuickstartV12.cpp 源文件
  3. 删除自动生成的 main 中的所有代码
  4. 添加 #include 语句
#include <stdlib.h>
#include <iostream>
#include <azure/storage/blobs.hpp>

获取连接字符串

下面的代码从配置存储连接字符串中创建的环境变量中检索存储帐户的连接字符串。

main() 中添加此代码:

// Retrieve the connection string for use with the application. The storage
        // connection string is stored in an environment variable on the machine
        // running the application called AZURE_STORAGE_CONNECTION_STRING.
        // Note that _MSC_VER is set when using MSVC compiler.
        static const char* AZURE_STORAGE_CONNECTION_STRING = "AZURE_STORAGE_CONNECTION_STRING";
#if !defined(_MSC_VER)
        const char* connectionString = std::getenv(AZURE_STORAGE_CONNECTION_STRING);
#else
        // Use getenv_s for MSVC
        size_t requiredSize;
        getenv_s(&requiredSize, NULL, NULL, AZURE_STORAGE_CONNECTION_STRING);
        if (requiredSize == 0) {
            throw std::runtime_error("missing connection string from env.");
        }
        std::vector<char> value(requiredSize);
        getenv_s(&requiredSize, value.data(), value.size(), AZURE_STORAGE_CONNECTION_STRING);
        std::string connectionStringStr = std::string(value.begin(), value.end());
        const char* connectionString = connectionStringStr.c_str();
#endif

创建容器

调用 CreateFromConnectionString 函数,创建 BlobContainerClient 类的实例。 然后调用 CreateIfNotExists,在存储帐户中创建实际容器。

重要

容器名称必须为小写。 有关命名容器和 Blob 的详细信息,请参阅命名和引用容器、Blob 和元数据

将此代码添加到 main() 的末尾:

using namespace Azure::Storage::Blobs;

std::string containerName = "myblobcontainer";

// Initialize a new instance of BlobContainerClient
BlobContainerClient containerClient
    = BlobContainerClient::CreateFromConnectionString(connectionString, containerName);

// Create the container. This will do nothing if the container already exists.
std::cout << "Creating container: " << containerName << std::endl;
containerClient.CreateIfNotExists();

将 blob 上传到容器中

以下代码片段:

  1. 声明一个包含“Hello Azure!”的字符串。
  2. 对在创建容器部分创建的容器调用 GetBlockBlobClient,获取对 BlockBlobClient 对象的引用。
  3. 通过调用 UploadFrom 函数,将字符串上传到 blob。 此函数将创建 Blob(如果该 Blob 尚不存在),或者更新 Blob(如果该 Blob 已存在)。

将此代码添加到 main() 的末尾:

std::string blobName = "blob.txt";
uint8_t blobContent[] = "Hello Azure!";
// Create the block blob client
BlockBlobClient blobClient = containerClient.GetBlockBlobClient(blobName);

// Upload the blob
std::cout << "Uploading blob: " << blobName << std::endl;
blobClient.UploadFrom(blobContent, sizeof(blobContent));

列出容器中的 blob

通过调用 ListBlobs 函数,列出容器中的 blob。 只向容器添加了一个 blob,所以此操作只返回这一个 blob。

将此代码添加到 main() 的末尾:

std::cout << "Listing blobs..." << std::endl;
auto listBlobsResponse = containerClient.ListBlobs();
for (auto blobItem : listBlobsResponse.Blobs)
{
    std::cout << "Blob name: " << blobItem.Name << std::endl;
}

下载 Blob

获取上传的 Blob 的属性。 然后,使用上传的 blob 的属性,声明新的 std::vector<uint8_t> 对象并调整其大小。 通过在 BlobClient 基类中调用 DownloadTo 函数,将以前创建的 blob 下载到新的 std::vector<uint8_t> 对象。 最后,显示下载的 blob 数据。

将此代码添加到 main() 的末尾:

auto properties = blobClient.GetProperties().Value;
std::vector<uint8_t> downloadedBlob(properties.BlobSize);

blobClient.DownloadTo(downloadedBlob.data(), downloadedBlob.size());
std::cout << "Downloaded blob contents: " << std::string(downloadedBlob.begin(), downloadedBlob.end()) << std::endl;

删除 Blob

以下代码通过调用 BlobClient 函数,从 Azure Blob 存储容器中删除 blob。

std::cout << "Deleting blob: " << blobName << std::endl;
blobClient.Delete();

删除容器

以下代码使用 BlobContainerClient.Delete 来删除整个容器,从而清除该应用创建的资源。

将此代码添加到 main() 的末尾:

std::cout << "Deleting container: " << containerName << std::endl;
containerClient.Delete();

运行代码

此应用将创建一个容器,并将文本文件上传到 Azure Blob 存储。 示例随后列出容器中的 Blob,下载文件并显示文件内容。 最后,应用会删除 blob 和容器。

应用的输出类似于以下示例:

Azure Blob Storage v12 - C++ quickstart sample
Creating container: myblobcontainer
Uploading blob: blob.txt
Listing blobs...
Blob name: blob.txt
Downloaded blob contents: Hello Azure!
Deleting blob: blob.txt
Deleting container: myblobcontainer

后续步骤

本快速入门介绍了如何使用 C++ 上传、下载和列出 Blob。 此外,还介绍了如何创建和删除 Azure Blob 存储容器。

若要查看 C++ Blob 存储示例,请继续参考以下内容: