Azure 存储中的 Blob 已组织成容器。 必须先创建容器,才能上传 Blob。 可以使用
BlobServiceClient
或
BlobContainerClient
中的方法在存储帐户中创建容器。 若要了解如何在存储帐户中创建容器,请参阅
使用 .NET 在 Azure 存储中创建容器
。
若要使用文件路径、流、二进制对象或文本字符串上传 Blob,请使用以下任一方法:
UploadAsync
若要在 Blob 存储中打开一个流,然后对该流写入,请使用以下任一方法:
OpenWrite
OpenWriteAsync
使用文件路径上传
以下示例使用文件路径上传 Blob:
public static async Task UploadFile
(BlobContainerClient containerClient, string localFilePath)
string fileName = Path.GetFileName(localFilePath);
BlobClient blobClient = containerClient.GetBlobClient(fileName);
await blobClient.UploadAsync(localFilePath, true);
使用 Stream 上传
以下示例通过创建 Stream 对象并上传该流来上传 Blob。
public static async Task UploadStream
(BlobContainerClient containerClient, string localFilePath)
string fileName = Path.GetFileName(localFilePath);
BlobClient blobClient = containerClient.GetBlobClient(fileName);
FileStream fileStream = File.OpenRead(localFilePath);
await blobClient.UploadAsync(fileStream, true);
fileStream.Close();
使用 BinaryData 对象上传
以下示例上传一个 BinaryData 对象。
public static async Task UploadBinary
(BlobContainerClient containerClient, string localFilePath)
string fileName = Path.GetFileName(localFilePath);
BlobClient blobClient = containerClient.GetBlobClient(fileName);
FileStream fileStream = File.OpenRead(localFilePath);
BinaryReader reader = new BinaryReader(fileStream);
byte[] buffer = new byte[fileStream.Length];
reader.Read(buffer, 0, buffer.Length);
BinaryData binaryData = new BinaryData(buffer);
await blobClient.UploadAsync(binaryData, true);
fileStream.Close();
上传字符串
以下示例上传一个字符串:
public static async Task UploadString
(BlobContainerClient containerClient, string localFilePath)
string fileName = Path.GetFileName(localFilePath);
BlobClient blobClient = containerClient.GetBlobClient(fileName);
await blobClient.UploadAsync(BinaryData.FromString("hello world"), overwrite: true);
Blob 索引标记使用键值标记属性对存储帐户中的数据进行分类。 这些标记会自动索引,并作为可搜索的多维索引公开,便于你轻松查找数据。 你可以执行此任务,方法是将标记添加到 BlobUploadOptions 实例,然后将该实例传递给 UploadAsync 方法。
以下示例上传具有三个索引标记的 Blob。
public static async Task UploadBlobWithTags
(BlobContainerClient containerClient, string localFilePath)
string fileName = Path.GetFileName(localFilePath);
BlobClient blobClient = containerClient.GetBlobClient(fileName);
BlobUploadOptions options = new BlobUploadOptions();
options.Tags = new Dictionary<string, string>
{ "Sealed", "false" },
{ "Content", "image" },
{ "Date", "2020-04-20" }
await blobClient.UploadAsync(localFilePath, options);
上传到 Blob 存储中的流
你可以在 Blob 存储中打开一个流并对该流写入。 以下示例在 Blob 存储中创建一个 zip 文件并对该文件写入文件。 不是在本地内存中生成一个 zip 文件,而是一次只在内存中生成一个文件。
public static async Task UploadToStream
(BlobContainerClient containerClient, string localDirectoryPath)
string zipFileName = Path.GetFileName
(Path.GetDirectoryName(localDirectoryPath)) + ".zip";
BlockBlobClient blockBlobClient =
containerClient.GetBlockBlobClient(zipFileName);
using (Stream stream = await blockBlobClient.OpenWriteAsync(true))
using (ZipArchive zip = new ZipArchive
(stream, ZipArchiveMode.Create, leaveOpen: false))
foreach (var fileName in Directory.EnumerateFiles(localDirectoryPath))
using (var fileStream = File.OpenRead(fileName))
var entry = zip.CreateEntry(Path.GetFileName
(fileName), CompressionLevel.Optimal);
using (var innerFile = entry.Open())
await fileStream.CopyToAsync(innerFile);
通过暂存块并提交来上传
你可以通过手动暂存各个数据块来更好地控制如何将上传内容划分为多个块。 暂存构成 Blob 的所有块后,可以将其提交到 Blob 存储。 如果想通过并行上传块来提高性能,你可以使用这种方法。
public static async Task UploadInBlocks
(BlobContainerClient blobContainerClient, string localFilePath, int blockSize)
string fileName = Path.GetFileName(localFilePath);
BlockBlobClient blobClient = blobContainerClient.GetBlockBlobClient(fileName);
FileStream fileStream = File.OpenRead(localFilePath);
ArrayList blockIDArrayList = new ArrayList();
byte[] buffer;
var bytesLeft = (fileStream.Length - fileStream.Position);
while (bytesLeft > 0)
if (bytesLeft >= blockSize)
buffer = new byte[blockSize];
await fileStream.ReadAsync(buffer, 0, blockSize);
buffer = new byte[bytesLeft];
await fileStream.ReadAsync(buffer, 0, Convert.ToInt32(bytesLeft));
bytesLeft = (fileStream.Length - fileStream.Position);
using (var stream = new MemoryStream(buffer))
string blockID = Convert.ToBase64String
(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()));
blockIDArrayList.Add(blockID);
await blobClient.StageBlockAsync(blockID, stream);
bytesLeft = (fileStream.Length - fileStream.Position);
string[] blockIDArray = (string[])blockIDArrayList.ToArray(typeof(string));
await blobClient.CommitBlockListAsync(blockIDArray);
若要详细了解如何使用适用于 .NET 的 Azure Blob 存储客户端库来上传 Blob,请参阅以下资源。
REST API 操作
Azure SDK for .NET 包含基于 Azure REST API 而生成的库,允许你通过熟悉的 .NET 范例与 REST API 操作进行交互。 用于上传 blob 的客户端库方法使用以下 REST API 操作:
放置 Blob (REST API)
从 URL 放置 Blob (REST API)
通过 Blob 索引标记管理和查找 Azure Blob 数据
使用 Blob 索引标记管理和查找 Azure Blob 存储上的数据