通过 .NET 开始使用 Azure Blob 存储

Tip

查看 Azure 存储代码示例存储库

若要获取能够下载和运行且易于使用的端到端 Azure 存储代码,请查看我们提供的 Azure 存储示例列表。

Azure Blob 存储是一种将非结构化数据作为对象/Blob 存储在云中的服务。 Blob 存储可以存储任何类型的文本或二进制数据,例如文档、媒体文件或应用程序安装程序。 Blob 存储也称为对象存储。

关于本教程

本教程演示如何针对使用 Azure Blob 存储一些常见情形编写 .NET 代码。 涉及的任务包括上传、列出、下载和删除 Blob。

先决条件:

Note

建议使用最新版本的用于 .NET 的 Azure 存储客户端库来完成本教程。 可以在 NuGet 上找到适合下载的最新版本。 GitHub 上提供客户端库的源代码。

若要使用存储模拟器,请参阅客户端库自述文件以了解版本要求。 若要将用于 .NET 的存储客户端库与存储模拟器配合使用,必须使用相应的最低版本的 Azure 存储模拟器。

什么是 Blob 存储

Azure Blob 存储是用于存储大量非结构化对象数据(例如文本或二进制数据)的服务,这些数据可通过 HTTP 或 HTTPS 从世界各地进行访问。 你可以使用 Blob 存储向外公开数据,或者私下存储应用程序数据。

Blob 存储的常见用途包括:

  • 直接向浏览器提供图像或文档
  • 存储文件以供分布式访问
  • 对视频和音频进行流式处理
  • 存储数据以用于备份和还原、灾难恢复及存档
  • 存储数据以供本地或 Azure 托管服务执行分析

Blob 服务概念

Blob 服务包含以下组件:

Blob 体系结构

  • 存储帐户: 对 Azure 存储服务的所有访问都要通过存储帐户来完成。 此存储帐户可以是常规用途存储帐户,也可以是专用于存储对象/Blob 的 Blob 存储帐户。 有关详细信息,请参阅关于 Azure 存储帐户
  • 容器: 一个容器包含一组 blob 集。 所有 blob 必须位于相应的容器中。 一个帐户可以包含无限个容器。 一个容器可以存储无限个 Blob。 请注意,容器名称必须小写。
  • Blob: 任何类型和大小的文件。 Azure 存储提供三种类型的 Blob:块 Blob、页 Blob 和追加 Blob。

    块 Blob 特别适用于存储短的文本或二进制文件,例如文档和媒体文件。 追加 Blob 类似于块 Blob,因为它们是由块组成的,但针对追加操作对它们进行了优化,因此它们适用于日志记录方案。 单个块 Blob 可以包含最多 50000 个块,每个块最大 100 MB,总大小稍微大于 4.75 TB (100 MB X 50000)。 单个追加 Blob 可以包含最多 50000 个块,每个块最大 4 MB,总大小稍微大于 195 GB (4 MB X 50000)。

    页 Blob 最大可达 1 TB 大小,并且对于频繁的读/写操作更加高效。 Azure 虚拟机使用页 Blob 作为 OS 和数据磁盘。

    有关命名容器和 Blob 的详细信息,请参阅 命名和引用容器、Blob 和元数据

创建 Azure 存储帐户

创建第一个 Azure 存储帐户的最简单方法是使用 Azure 门户。 若要了解更多信息,请参阅 创建存储帐户

还可使用 Azure PowerShellAzure CLI适用于 .NET 的存储资源提供程序客户端库创建 Azure 存储帐户。

如果暂时不想创建存储帐户,也可以使用 Azure 存储模拟器在本地环境中运行和测试代码。 有关详细信息,请参阅 使用 Azure 存储模拟器进行开发和测试

设置开发环境

接下来在 Visual Studio 中设置开发环境,然后即可试用本指南中的代码示例。

创建 Windows 控制台应用程序项目

在 Visual Studio 中创建新的 Windows 控制台应用程序。 以下步骤演示如何在 Visual Studio 2017 中创建控制台应用程序,但是,其他 Visual Studio 版本中的步骤是类似的。

  1. 选择“文件” > “新建” > “项目”
  2. 选择“已安装” > “模板” > “Visual C#” > “Windows 经典桌面”
  3. 选择“控制台应用(.NET Framework)”
  4. 在“名称:”字段中输入应用程序的名称
  5. 选择“确定”

Visual Studio 中的项目创建对话框

本教程中的所有代码示例都可以添加到控制台应用程序的 Program.cs 文件的 Main() 方法。

可以在任意类型的 .NET 应用程序(包括 Azure 云服务或 Web 应用,以及桌面和移动应用程序)中使用 Azure 存储客户端库。 为简单起见,我们在本指南中使用控制台应用程序。

使用 NuGet 安装所需包

为完成此教程,需要在项目中引用两个包:

可以使用 NuGet 获取这两个包。 执行以下步骤:

  1. 在“解决方案资源管理器”中,右键单击你的项目并选择“管理 NuGet 包”。
  2. 在线搜索“WindowsAzure.Storage”,然后单击“安装” 以安装存储客户端库和依赖项。
  3. 在线搜索“WindowsAzure.ConfigurationManager”,然后单击“安装”以安装 Azure Configuration Manager。
Note

用于 .NET 的 Azure SDK中也包含存储客户端库包。 但是我们建议同时从 NuGet 安装存储客户端库,以确保始终使用客户端库的最新版本。

适用于 .NET 的存储客户端库中的 ODataLib 依赖项通过 NuGet(而非 WCF 数据服务)上提供的 ODataLib 包来解析。 ODataLib 库可直接下载或者通过 NuGet 由代码项目引用。 存储空间客户端库使用的具体 ODataLib 包是 ODataEdmSpatial。 尽管这些库由 Azure 表存储类使用,但是用存储空间客户端库进行编程时,它们是必需的依赖项。

确定目标环境

可从两个环境中选择用于运行本指南中示例的环境:

  • 可针对云中的 Azure 存储帐户运行代码。
  • 可针对 Azure 存储模拟器运行代码。 存储模拟器是模拟云中 Azure 存储帐户的本地环境。 应用程序处于开发阶段时,可以选择使用模拟器免费测试和调试代码。 模拟器使用已知帐户和密钥。 有关详细信息,请参阅使用 Azure 存储模拟器进行开发和测试

如果你以云中的存储帐户为目标,请从 Azure 门户复制存储帐户的主访问密钥。 有关详细信息,请参阅 查看和复制存储访问密钥

Note

您可以指向存储模拟器以避免引发与 Azure 存储有关的任何费用。 但是,如果您确实选择指向云中的 Azure 存储帐户,则执行此教程的费用将会忽略不计。

配置存储连接字符串

用于 .NET 的 Azure 存储客户端库支持使用存储连接字符串来配置终结点和用于访问存储服务的凭据。 维护存储连接字符串的最佳方法在配置文件中。

有关连接字符串的详细信息,请参阅 配置 Azure 存储的连接字符串

Note

您的存储帐户密钥类似于您的存储帐户的根密码。 始终要小心保护存储帐户密钥。 避免将其分发给其他用户、对其进行硬编码或将其保存在其他人可以访问的纯文本文件中。 如果认为密钥可能已泄漏,请使用 Azure 门户重新生成密钥。

若要配置连接字符串,请从 Visual Studio 中的解决方案资源管理器打开 app.config 文件。 添加 <appSettings> 元素的内容,如下所示。 将 account-name 替换为您的存储帐户名称,将 account-key 替换为您的存储帐户密钥:

<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
      <appSettings>
        <add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=account-name;AccountKey=account-key;EndpointSuffix=core.chinacloudapi.cn" />
      </appSettings>
</configuration>

例如,配置设置看起来类似于:

<add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=storagesample;AccountKey=GMuzNHjlB3S9itqZJHHCnRkrokLkcSyW7yK9BRbGp0ENePunLPwBgpxV1Z/pVo9zpem/2xSHXkMqTHHLcx8XRA==" />

若要以存储模拟器为目标,可使用映射到已知帐户名称和密钥的快捷方式。 在这种情况下,连接字符串设置如下所示:

<add key="StorageConnectionString" value="UseDevelopmentStorage=true;" />

添加 using 指令

将以下 using 指令添加到 Program.cs 文件顶部:

using Microsoft.Azure; // Namespace for CloudConfigurationManager
using Microsoft.WindowsAzure.Storage; // Namespace for CloudStorageAccount
using Microsoft.WindowsAzure.Storage.Blob; // Namespace for Blob storage types

解析连接字符串

适用于 .NET 的 Microsoft Azure Configuration Manager 库 提供用于分析配置文件中连接字符串的类。 CloudConfigurationManager 类分析配置设置,而不考虑客户端应用程序是在台式计算机、移动设备、Azure 虚拟机还是 Azure 云服务中运行。

若要引用 CloudConfigurationManager 包,请添加以下 using 指令:

using Microsoft.Azure;  //Namespace for CloudConfigurationManager

以下示例演示如何从配置文件中检索连接字符串:

// Parse the connection string and return a reference to the storage account.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

不一定非要使用 Azure 配置管理器。 也可以使用 API,例如 .NET Framework 的 ConfigurationManager 类。

创建 Blob 服务客户端

CloudBlobClient 类使你能够在 Blob 存储中检索容器和 blob。 下面是创建服务客户端的一种方法:

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

现在,你已准备好编写从 Blob 存储读取数据并将数据写入 Blob 存储的代码。

创建容器

Azure 存储中的每个 Blob 必须驻留在一个容器中。 该容器构成 Blob 名称的一部分。 例如,在这些示例 Blob URI 中,mycontainer 是容器的名称:

https://storagesample.blob.core.chinacloudapi.cn/mycontainer/blob1.txt
https://storagesample.blob.core.chinacloudapi.cn/mycontainer/photos/myphoto.jpg

容器名称必须是有效的 DNS 名称,并符合以下命名规则:

  1. 容器名称必须以字母或数字开头,并且只能包含字母、数字和短划线 (-) 字符。
  2. 每个短划线 (-) 字符的前面和后面都必须是一个字母或数字;在容器名称中不允许连续的短划线 (-)。
  3. 容器名称中的所有字母都必须为小写。
  4. 容器名称必须介于 3 到 63 个字符。
Important

请注意,容器的名称必须始终为小写。 如果你在容器名称中包括大写字母或以其他方式违反了容器命名规则,则可能会收到 400 错误(错误请求)。

此示例演示如何创建一个容器(如果该容器不存在):

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve a reference to a container.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// Create the container if it doesn't already exist.
container.CreateIfNotExists();

默认情况下,新容器是专用容器,意思是必须指定存储访问密钥才能从该容器下载 blob。 如果你要让容器中的文件可供所有人使用,则可以使用以下代码将容器设置为公共容器:

container.SetPermissions(
    new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });

在 Internet 上的任何人都可以看到公共容器中的 Blob。 但是,仅当你具有相应的帐户访问密钥或共享访问签名时,才能修改或删除它们。

将 Blob 上传到容器中

Azure Blob 存储支持块 Blob 和页 Blob。 大多数情况下,推荐使用块 Blob 类型。

若要将文件上传到块 Blob,请获取容器引用,并使用它获取块 Blob 引用。 获取 Blob 引用后,可以通过调用 UploadFromStream 方法,将任何数据流上传到该 Blob。 如果之前不存在 Blob,此操作将创建一个;如果存在 Blob,此操作将覆盖它。

下面的示例演示了如何将 Blob 上传到容器中,并假定已创建容器。

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// Retrieve reference to a blob named "myblob".
CloudBlockBlob blockBlob = container.GetBlockBlobReference("myblob");

// Create or overwrite the "myblob" blob with contents from a local file.
using (var fileStream = System.IO.File.OpenRead(@"path\myfile"))
{
    blockBlob.UploadFromStream(fileStream);
}

列出容器中的 Blob

若要列出容器中的 Blob,首先需要获取容器引用。 然后,可以使用容器的 ListBlobs 方法来检索其中的 Blob 和/或目录。 若要访问返回的 IListBlobItem 的丰富属性和方法,必须将它转换为 CloudBlockBlobCloudPageBlobCloudBlobDirectory 对象。 如果类型未知,可以使用类型检查来确定要将其转换为哪种类型。 以下代码演示了如何检索和输出 photos 容器中每项的 URI:

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("photos");

// Loop over items within the container and output the length and URI.
foreach (IListBlobItem item in container.ListBlobs(null, false))
{
    if (item.GetType() == typeof(CloudBlockBlob))
    {
        CloudBlockBlob blob = (CloudBlockBlob)item;

        Console.WriteLine("Block blob of length {0}: {1}", blob.Properties.Length, blob.Uri);

    }
    else if (item.GetType() == typeof(CloudPageBlob))
    {
        CloudPageBlob pageBlob = (CloudPageBlob)item;

        Console.WriteLine("Page blob of length {0}: {1}", pageBlob.Properties.Length, pageBlob.Uri);

    }
    else if (item.GetType() == typeof(CloudBlobDirectory))
    {
        CloudBlobDirectory directory = (CloudBlobDirectory)item;

        Console.WriteLine("Directory: {0}", directory.Uri);
    }
}

将路径信息包括在 Blob 名称中即可创建一个虚拟目录结构,你可以像使用传统文件系统一样进行组织和遍历。 该目录结构仅仅是虚拟的 - Blob 存储中能够使用的资源只有容器和 Blob。 但是,存储空间客户端库提供 CloudBlobDirectory 对象来引用虚拟目录,并简化了以这种方式组织的 Blob 的使用过程。

例如,请考虑名为 photos 的容器中包含的下面一组块 Blob:

photo1.jpg
2010/architecture/description.txt
2010/architecture/photo3.jpg
2010/architecture/photo4.jpg
2011/architecture/photo5.jpg
2011/architecture/photo6.jpg
2011/architecture/description.txt
2011/photo7.jpg

photos 容器调用 ListBlobs 时(如前述代码片段所示),将返回一个层次结构列表。 它包含 CloudBlobDirectoryCloudBlockBlob 对象,分别表示容器中的目录和 Blob。 生成的输出如下所示:

Directory: https://<accountname>.blob.core.chinacloudapi.cn/photos/2010/
Directory: https://<accountname>.blob.core.chinacloudapi.cn/photos/2011/
Block blob of length 505623: https://<accountname>.blob.core.chinacloudapi.cn/photos/photo1.jpg

另外,也可以将 ListBlobs 方法的 UseFlatBlobListing 参数设置为 true。 在这种情况下,作为 CloudBlockBlob 对象返回容器中的每一个 Blob。 对 ListBlobs 的调用返回一个平面列表,如下所示:

// Loop over items within the container and output the length and URI.
foreach (IListBlobItem item in container.ListBlobs(null, true))
{
    ...
}

结果如下所示:

Block blob of length 4: https://<accountname>.blob.core.chinacloudapi.cn/photos/2010/architecture/description.txt
Block blob of length 314618: https://<accountname>.blob.core.chinacloudapi.cn/photos/2010/architecture/photo3.jpg
Block blob of length 522713: https://<accountname>.blob.core.chinacloudapi.cn/photos/2010/architecture/photo4.jpg
Block blob of length 4: https://<accountname>.blob.core.chinacloudapi.cn/photos/2011/architecture/description.txt
Block blob of length 419048: https://<accountname>.blob.core.chinacloudapi.cn/photos/2011/architecture/photo5.jpg
Block blob of length 506388: https://<accountname>.blob.core.chinacloudapi.cn/photos/2011/architecture/photo6.jpg
Block blob of length 399751: https://<accountname>.blob.core.chinacloudapi.cn/photos/2011/photo7.jpg
Block blob of length 505623: https://<accountname>.blob.core.chinacloudapi.cn/photos/photo1.jpg

下载 Blob

若要下载 Blob,请首先检索 Blob 引用,然后调用 DownloadToStream 方法。 以下示例使用 DownloadToStream 方法将 Blob 内容传输到一个流对象,然后您可以将该对象保存到本地文件。

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// Retrieve reference to a blob named "photo1.jpg".
CloudBlockBlob blockBlob = container.GetBlockBlobReference("photo1.jpg");

// Save blob contents to a file.
using (var fileStream = System.IO.File.OpenWrite(@"path\myfile"))
{
    blockBlob.DownloadToStream(fileStream);
}

也可以使用 DownloadToStream 方法以文本字符串形式下载 Blob 的内容。

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// Retrieve reference to a blob named "myblob.txt"
CloudBlockBlob blockBlob2 = container.GetBlockBlobReference("myblob.txt");

string text;
using (var memoryStream = new MemoryStream())
{
    blockBlob2.DownloadToStream(memoryStream);
    text = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
}

删除 Blob

若要删除 Blob,首先要获取 Blob 引用,然后对其调用 Delete 方法。

// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// Retrieve reference to a blob named "myblob.txt".
CloudBlockBlob blockBlob = container.GetBlockBlobReference("myblob.txt");

// Delete the blob.
blockBlob.Delete();

以异步方式列出页中的 Blob

如果要列出大量 Blob,或需要控制一个列表操作中返回的结果数,则可以结果页的方式列出 Blob。 此示例显示如何以页面形式异步返回结果,这样就不会在等待返回大型结果集时阻止操作的执行。

此示例演示平面 Blob 列表,但也可以执行分层列表,只需将 ListBlobsSegmentedAsync 方法的 useFlatBlobListing 参数设置为 false 即可。

由于示例方法调用了一个异步方法,因此必须以 async 关键字开头,且必须返回 Task 对象。 为 ListBlobsSegmentedAsync 方法指定的 await 关键字将挂起示例方法的执行,直至列表任务完成。

async public static Task ListBlobsSegmentedInFlatListing(CloudBlobContainer container)
{
    //List blobs to the console window, with paging.
    Console.WriteLine("List blobs in pages:");

    int i = 0;
    BlobContinuationToken continuationToken = null;
    BlobResultSegment resultSegment = null;

    //Call ListBlobsSegmentedAsync and enumerate the result segment returned, while the continuation token is non-null.
    //When the continuation token is null, the last page has been returned and execution can exit the loop.
    do
    {
        //This overload allows control of the page size. You can return all remaining results by passing null for the maxResults parameter,
        //or by calling a different overload.
        resultSegment = await container.ListBlobsSegmentedAsync("", true, BlobListingDetails.All, 10, continuationToken, null, null);
        if (resultSegment.Results.Count<IListBlobItem>() > 0) { Console.WriteLine("Page {0}:", ++i); }
        foreach (var blobItem in resultSegment.Results)
        {
            Console.WriteLine("\t{0}", blobItem.StorageUri.PrimaryUri);
        }
        Console.WriteLine();

        //Get the continuation token.
        continuationToken = resultSegment.ContinuationToken;
    }
    while (continuationToken != null);
}

写入追加 Blob

追加 Blob 针对追加操作(例如日志记录)进行了优化。 类似于块 Blob,追加 Blob 由块组成,但是当你将新的块添加到追加 Blob 时,始终追加到该 Blob 的末尾。 你不能更新或删除追加 Blob 中现有的块。 追加 Blob 的块 ID 不公开,因为它们是用于一个块 Blob 的。

追加 Blob 中的每个块可以有不同的大小,最大为 4 MB,并且追加 Blob 最多可包含 50000 个块。 因此,追加 Blob 的最大大小稍微大于 195 GB(4 MB X 50000 块)。

下面的示例创建一个新的追加 Blob 并向其追加某些数据,模拟一个简单的日志记录操作。

//Parse the connection string for the storage account.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));

//Create service client for credentialed access to the Blob service.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

//Get a reference to a container.
CloudBlobContainer container = blobClient.GetContainerReference("my-append-blobs");

//Create the container if it does not already exist.
container.CreateIfNotExists();

//Get a reference to an append blob.
CloudAppendBlob appendBlob = container.GetAppendBlobReference("append-blob.log");

//Create the append blob. Note that if the blob already exists, the CreateOrReplace() method will overwrite it.
//You can check whether the blob exists to avoid overwriting it by using CloudAppendBlob.Exists().
appendBlob.CreateOrReplace();

int numBlocks = 10;

//Generate an array of random bytes.
Random rnd = new Random();
byte[] bytes = new byte[numBlocks];
rnd.NextBytes(bytes);

//Simulate a logging operation by writing text data and byte data to the end of the append blob.
for (int i = 0; i < numBlocks; i++)
{
    appendBlob.AppendText(String.Format("Timestamp: {0:u} \tLog Entry: {1}{2}",
        DateTime.UtcNow, bytes[i], Environment.NewLine));
}

//Read the append blob to the console window.
Console.WriteLine(appendBlob.DownloadText());

请参阅 了解块 Blob、页 Blob 和追加 Blob ,就有关三种 Blob 之间的差异了解详细信息。

管理 Blob 安全性

默认情况下,Azure 存储会限制拥有帐户访问密钥的帐户所有者的访问权限来保持数据安全。 当你需要共享存储帐户中的 Blob 数据时,请注意不可危及帐户访问密钥的安全性。 此外,可以加密 Blob 数据,以确保其在网络中传输时以及在 Azure 存储中时的安全性。

Important

您的存储帐户密钥类似于您的存储帐户的根密码。 始终要小心保护帐户密钥。 避免将其分发给其他用户、对其进行硬编码或将其以纯文本形式保存在其他人可以访问的任何位置。 如果认为帐户密钥可能已泄漏,请使用 Azure 门户重新生成帐户密钥。 若要了解如何重新生成帐户密钥,请参阅如何在 Azure 门户中创建、管理或删除存储帐户

控制对 Blob 数据的访问

默认情况下,你的存储帐户中的 Blob 数据仅供存储帐户所有者访问。 默认情况下,验证对 Blob 存储的请求需要帐户访问密钥。 不过,你可能想要让特定的 Blob 数据可供其他用户使用。 可以使用两个选项:

  • 匿名访问 :你可让容器或其 Blob 公开供匿名访问。 有关详细信息,请参阅 管理对容器和 Blob 的匿名读取访问
  • 共享访问签名 :你可以为客户端提供共享访问签名 (SAS),该共享访问签名可利用所指定的权限在所指定的时间间隔内,针对存储帐户中的资源提供委派访问权限。 有关详细信息,请参阅 使用共享访问签名 (SAS)

加密 Blob 数据

Azure 存储支持在客户端和服务器上加密 Blob 数据:

后续步骤

现在,你已了解 Blob 存储的基础知识,可单击下面的链接了解详细信息。

Azure 存储资源管理器

Blob 存储参考

概念性指南