Trong bài viết này, chúng ta sẽ đi qua các khái niệm về container, blobName, metadata và blob index. Từ đó chúng ta sẽ dễ dàng quản lý file trên container
Container
Container là một thư mục ảo để chứa các blob. Mỗi container phải có một tên duy nhất trong storage account
BlobName
BlobName là tên của một blob. BlobName phải là duy nhất trong container.
Ví dụ khi bạn mở Properties của 1 blob file trên AzureOverview
Blob: TEMP/026a9132-16a3-4f14-9186-bfcb0eff4d3e
URL: https://abc-xyz.blob.core.windows.net/abc/TEMP/026a9132-16a3-4f14-9186-bfcb0eff4d3e
...
Metadata
Key Value
...
Blob index tags
Key Value
...
Trong đó:
- container: abc
- blobName: TEMP/026a9132-16a3-4f14-9186-bfcb0eff4d3e
//...
var blobServiceClient = new BlobServiceClient(connectionString);
_blobContainerClient = blobServiceClient.GetBlobContainerClient(containerName);
//...
public BlobClient Upload(byte[] data, string blobName, string containerName)
{
var binaryData = new BinaryData(data);
var blobClient = _blobContainerClient.GetBlobClient($"{containerName}/{blobName}");
blobClient.Upload(binaryData, true);
return blobClient;
}
Metadata
Metadata là thông tin mô tả blob, ví dụ như name, status, type, v.v.
Ví dụ:async Task SetMetadata(string storageAccountName, string accessKey, string blobBaseUri, string containerName, string blobName)
{
var sharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, accessKey);
var blobServiceClient = new BlobServiceClient(new Uri(blobBaseUri), sharedKeyCredential);
var containerClient = blobServiceClient.GetBlobContainerClient(containerName);
var blobClient = containerClient.GetBlobClient(blobName);
// Set the metadata.
Dictionary<string, string> metadata = new();
metadata.Add("Status", "1");
blobClient.SetMetadata(metadata);
// Get the metadata.
BlobProperties blobProperties = await blobClient.GetPropertiesAsync();
Console.WriteLine("Blob metadata:");
// Enumerate the blob's metadata.
foreach (var metadataItem in blobProperties.Metadata)
{
Console.WriteLine($"\tKey: {metadataItem.Key}");
Console.WriteLine($"\tValue: {metadataItem.Value}");
}
}
Nhược điểm của metadata là không thể dùng query để search trên Storage Account
Index tag
Vào tháng 5/2020, Microsoft thông báo một tính năng mới cho Azure blob Storage là Blob Index. Đây là tính năng cho phép bạn thêm key/value tags vào Blob object. Bạn có thể dễ dạng query Blob object mà không cần sử dụng dịch vụ Azure Search.
Có 1 số giới hạn có Index Tags
- Mỗi blob có tối đa 10 blob index tag
- Tag key có độ dài từ 1-128 kí tự
- Tag value có độ dài từ 0-256 kí tự
- Tag key và value phân biệt chữ hoa và thường
- Chỉ hỗ trợ string
- ...
Dưới đây là Service dùng để upload và kiểm tra index tag
public class StorageService
{
private readonly BlobServiceClient _client;
public StorageService()
{
var connectionString = "DefaultEndpointsProtocol=https;AccountName=...";
_client = new BlobServiceClient(connectionString);
}
public async Task UploadFile(string containerName, string filePath, Dictionary<string, string> tags)
{
string fileName = Path.GetFileName(filePath);
BlobContainerClient container = _client.GetBlobContainerClient(containerName);
BlobClient blob = container.GetBlobClient(fileName);
using FileStream fileStream = File.OpenRead(filePath);
await blob.UploadAsync(fileStream, true);
fileStream.Close();
await blob.SetTagsAsync(tags);
}
public async Task<List<TaggedBlobItem>> FindCustomerFiles(string customerName, string containerName = "")
{
var foundItems = new List<TaggedBlobItem>();
string searchExpression = $"\"customer\"='{customerName}'";
if (!string.IsNullOrEmpty(containerName))
searchExpression = $"@container = '{containerName}' AND \"customer\" = '{customerName}'";
await foreach (var page in _client.FindBlobsByTagsAsync(searchExpression).AsPages())
{
foundItems.AddRange(page.Values);
}
return foundItems;
}
}
Kiểm tra Service:var storageService = new StorageService();
var files = await storageService.FindCustomerFiles(customerName: "Acme Inc.", containerName: "abc");
foreach (var file in files)
{
Console.WriteLine(file.BlobName);
}
Lưu ý: Hiện tại hàm FindBlobsByTagsAsync() chỉ hoạt động với Azure Storage Account, không hoạt động được với Emulator Storage Account.
Một số quy tắc cho query
Sử dụng dấu nháy đơn cho key và dấu nháy kép cho value
Blob index filter chỉ hoạt động tốt cho query 1 tag hoặc sử dụng >, >=, <, <= trên 1 thẻ duy nhất.
Tham khảo
Searching Azure Blob Storage using Blob IndexDeveloping Solutions for Microsoft Azure AZ-204 Exam Guide
Nhận xét
Đăng nhận xét