在 Azure 儲存體 中儲存和存取數據Xamarin.Forms
Azure 儲存體 是可調整的雲端記憶體解決方案,可用來儲存非結構化和結構化數據。 本文示範如何使用 將Xamarin.Forms文字和二進位數據儲存在 Azure 儲存體,以及如何存取數據。
Azure 儲存體 提供四個記憶體服務:
- Blob 儲存體。 Blob 可以是文字或二進位數據,例如備份、虛擬機、媒體檔案或檔。
- 數據表 儲存體 是 NoSQL 索引鍵屬性存放區。
- 佇列 儲存體 是一種傳訊服務,可用於雲端服務之間的工作流程處理和通訊。
- 檔案 儲存體 使用SMB通訊協定提供共用記憶體。
記憶體帳戶有兩種類型:
- 一般用途的記憶體帳戶可讓您從單一帳戶存取 Azure 儲存體 服務。
- Blob 記憶體帳戶是用來儲存 Blob 的特殊記憶體帳戶。 當您只需要儲存 Blob 數據時,建議使用此帳戶類型。
本文和隨附的範例應用程式示範如何將影像和文本檔上傳至 Blob 記憶體,以及下載它們。 此外,它也會示範如何從 Blob 記憶體擷取檔案清單,以及刪除檔案。
如需 Azure 儲存體 的詳細資訊,請參閱 儲存體 簡介。
注意
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
Blob 儲存體 簡介
Blob 記憶體包含三個元件,如下圖所示:
Azure 儲存體 的所有存取權都是透過記憶體帳戶。 記憶體帳戶可以包含不限數量的容器,而容器可以儲存無限制數目的 Blob,最多可達記憶體帳戶的容量限制。
Blob 是任何類型和大小的檔案。 Azure 儲存體 支援三種不同的 Blob 類型:
- 區塊 Blob 已針對串流和儲存雲端對象進行優化,是儲存備份、媒體檔案、檔等的好選擇。區塊 Blob 的大小最多可達 195Gb。
- 附加 Blob 類似於區塊 Blob,但已針對附加作業進行優化,例如記錄。 附加 Blob 的大小最多可達 195Gb。
- 分頁 Blob 已針對頻繁的讀取/寫入作業進行優化,通常用於儲存虛擬機及其磁碟。 分頁 Blob 的大小最多可達 1Tb。
注意
請注意,Blob 記憶體帳戶支援區塊和附加 Blob,但不支援分頁 Blob。
Blob 會上傳至 Azure 儲存體,並從 Azure 儲存體 下載為位元組數據流。 因此,檔案必須在上傳之前轉換為位元組數據流,並在下載之後轉換為原始表示法。
儲存在 Azure 儲存體 中的每個物件都有唯一的 URL 位址。 記憶體帳戶名稱會形成該位址的子域,而子域和域名的組合會形成 記憶體帳戶的端點 。 例如,如果您的記憶體帳戶名為 mystorageaccount,則記憶體帳戶的預設 Blob 端點為 https://mystorageaccount.blob.core.windows.net
。
存取儲存體帳戶中物件的 URL 建置方式,是將物件在儲存體帳戶中的位置附加至端點。 例如,Blob 位址格式會是 https://mystorageaccount.blob.core.windows.net/mycontainer/myblob
。
設定
將 Azure 儲存體 帳戶整合到Xamarin.Forms應用程式中的程式如下:
- 建立儲存體帳戶。 如需詳細資訊,請參閱建立儲存體帳戶。
- 將 Azure 儲存體客戶端連結庫新增至Xamarin.Forms應用程式。
- 設定記憶體 連接字串。 如需詳細資訊,請參閱 連線 Azure 儲存體。
- 將和
Microsoft.WindowsAzure.Storage.Blob
命名空間的指示詞Microsoft.WindowsAzure.Storage
新增using
至將存取 Azure 儲存體 的類別。
連線到 Azure 儲存體
針對記憶體帳戶資源提出的每個要求都必須經過驗證。 雖然 Blob 可以設定為支援匿名驗證,但應用程式可用來向記憶體帳戶進行驗證的主要方法有兩種:
- 共用金鑰。 此方法會使用 Azure 儲存體 帳戶名稱和帳戶金鑰來存取記憶體服務。 儲存體帳戶會在建立時指派兩個私鑰,可用於共用密鑰驗證。
- 共用存取簽章。 這是可附加至 URL 的令牌,可讓委派存取記憶體資源,以及它所指定的許可權,在有效期間內。
您可以指定 連線 字串,其中包含從應用程式存取 Azure 儲存體 資源所需的驗證資訊。 此外,連接字串 也可以設定為從 Visual Studio 連線到 Azure 記憶體模擬器。
注意
Azure 儲存體支援 連接字串 中的 HTTP 和 HTTPS。 不過,建議使用 HTTPS。
連線 至 Azure 儲存體 模擬器
Azure 記憶體模擬器提供本機環境,以模擬用於開發目的的 Azure Blob、佇列和數據表服務。
下列 連接字串 應該用來連線到 Azure 記憶體模擬器:
UseDevelopmentStorage=true
如需 Azure 記憶體模擬器的詳細資訊,請參閱 使用 Azure 記憶體模擬器進行開發和測試。
使用共用金鑰 連線 Azure 儲存體
下列 連接字串 格式應該用來使用共用金鑰連線到 Azure 儲存體:
DefaultEndpointsProtocol=[http|https];AccountName=myAccountName;AccountKey=myAccountKey
myAccountName
應以記憶體帳戶的名稱取代,且 myAccountKey
應取代為兩個帳戶存取密鑰的其中一個。
注意
使用共用金鑰驗證時,您的帳戶名稱和帳戶金鑰將會散發給使用您應用程式的每個人,這會提供記憶體帳戶的完整讀取/寫入存取權。 因此,請只針對測試目的使用共用密鑰驗證,且絕不會將密鑰散發給其他使用者。
使用共用存取簽章 連線 至 Azure 儲存體
下列 連接字串 格式應該用來使用 SAS 連線到 Azure 儲存體:
BlobEndpoint=myBlobEndpoint;SharedAccessSignature=mySharedAccessSignature
myBlobEndpoint
應該以 Blob 端點的 URL 取代,並 mySharedAccessSignature
應取代為 SAS。 SAS 提供通訊協議、服務端點,以及用來存取資源的認證。
注意
建議針對生產應用程式使用SAS驗證。 不過,在生產應用程式中,SAS 應該依需求從後端服務擷取,而不是與應用程式搭配使用。
如需共用存取簽章的詳細資訊,請參閱使用共用存取簽章(SAS)。
建立容器
方法 GetContainer
可用來擷取具名容器的參考,然後可用來從容器擷取 Blob 或將 Blob 新增至容器。 下列程式碼範例示範 GetContainer
方法:
static CloudBlobContainer GetContainer(ContainerType containerType)
{
var account = CloudStorageAccount.Parse(Constants.StorageConnection);
var client = account.CreateCloudBlobClient();
return client.GetContainerReference(containerType.ToString().ToLower());
}
方法CloudStorageAccount.Parse
會剖析 連接字串,並傳CloudStorageAccount
回代表記憶體帳戶的實例。 CloudBlobClient
實例,用來擷取容器和 Blob,然後由 CreateCloudBlobClient
方法建立。 方法會 GetContainerReference
先將指定的容器擷取為 CloudBlobContainer
實例,然後再傳回呼叫方法。 在此範例中,容器名稱是 ContainerType
列舉值,轉換成小寫字串。
注意
容器名稱必須是小寫,且開頭必須是字母或數位。 此外,它們只能包含字母、數位和虛線字元,且長度必須介於 3 到 63 個字元之間。
方法 GetContainer
的叫用方式如下:
var container = GetContainer(containerType);
CloudBlobContainer
然後,如果實例不存在,就可以用來建立容器:
await container.CreateIfNotExistsAsync();
根據預設,新建立的容器是私人的。 這表示必須指定記憶體存取密鑰,才能從容器擷取 Blob。 如需在容器公用內建立 Blob 的相關信息,請參閱 建立容器。
將數據上傳至容器
方法 UploadFileAsync
可用來將位元組數據的數據流上傳至 Blob 記憶體,如下列程式代碼範例所示:
public static async Task<string> UploadFileAsync(ContainerType containerType, Stream stream)
{
var container = GetContainer(containerType);
await container.CreateIfNotExistsAsync();
var name = Guid.NewGuid().ToString();
var fileBlob = container.GetBlockBlobReference(name);
await fileBlob.UploadFromStreamAsync(stream);
return name;
}
擷取容器參考之後,如果容器不存在,方法就會建立容器。 接著會建立新的 Guid
來作為唯一的 Blob 名稱,並擷取 Blob 區塊參考做為 CloudBlockBlob
實例。 然後,數據串流會使用 UploadFromStreamAsync
方法上傳至 Blob,如果 Blob 不存在,則會建立 Blob;如果 Blob 不存在,則會覆寫它。
使用此方法將檔案上傳至 Blob 記憶體之前,必須先將它轉換成位元組數據流。 下列程式代碼範例會示範此問題:
var byteData = Encoding.UTF8.GetBytes(text);
uploadedFilename = await AzureStorage.UploadFileAsync(ContainerType.Text, new MemoryStream(byteData));
數據 text
會轉換成位元組陣列,然後包裝成傳遞至 UploadFileAsync
方法的數據流。
從容器下載數據
方法GetFileAsync
可用來從 Azure 儲存體 下載 Blob 數據,如下列程式代碼範例所示:
public static async Task<byte[]> GetFileAsync(ContainerType containerType, string name)
{
var container = GetContainer(containerType);
var blob = container.GetBlobReference(name);
if (await blob.ExistsAsync())
{
await blob.FetchAttributesAsync();
byte[] blobBytes = new byte[blob.Properties.Length];
await blob.DownloadToByteArrayAsync(blobBytes, 0);
return blobBytes;
}
return null;
}
擷取容器參考之後,方法會擷取儲存數據的 Blob 參考。 如果 Blob 存在,則會由 方法擷 FetchAttributesAsync
取其屬性。 系統會建立正確大小的位元組陣列,並將 Blob 下載為位元組陣列,以傳回呼叫方法的位元組陣列。
下載 Blob 位元組數據之後,必須將它轉換成其原始表示法。 下列程式代碼範例會示範此問題:
var byteData = await AzureStorage.GetFileAsync(ContainerType.Text, uploadedFilename);
string text = Encoding.UTF8.GetString(byteData);
方法會從 Azure 儲存體 GetFileAsync
擷取位元組陣列,然後再轉換成UTF8編碼字串。
列出容器中的數據
方法 GetFilesListAsync
可用來擷取儲存在容器中的 Blob 清單,如下列程式代碼範例所示:
public static async Task<IList<string>> GetFilesListAsync(ContainerType containerType)
{
var container = GetContainer(containerType);
var allBlobsList = new List<string>();
BlobContinuationToken token = null;
do
{
var result = await container.ListBlobsSegmentedAsync(token);
if (result.Results.Count() > 0)
{
var blobs = result.Results.Cast<CloudBlockBlob>().Select(b => b.Name);
allBlobsList.AddRange(blobs);
}
token = result.ContinuationToken;
} while (token != null);
return allBlobsList;
}
擷取容器參考之後,方法會使用容器的 ListBlobsSegmentedAsync
方法來擷取容器內 Blob 的參考。 當 實例不是 null
時BlobContinuationToken
,會列舉 方法傳ListBlobsSegmentedAsync
回的結果。 每個 Blob 都會從 傳回 IListBlobItem
的 CloudBlockBlob
轉換成 ,以便存取 Name
Blob 的 屬性,然後才將它的值新增至 allBlobsList
集合。 BlobContinuationToken
實例為 null
之後,就會傳回最後一個 Blob 名稱,而執行會結束迴圈。
從容器刪除數據
方法 DeleteFileAsync
可用來從容器中刪除 Blob,如下列程式代碼範例所示:
public static async Task<bool> DeleteFileAsync(ContainerType containerType, string name)
{
var container = GetContainer(containerType);
var blob = container.GetBlobReference(name);
return await blob.DeleteIfExistsAsync();
}
擷取容器參考之後,方法會擷取指定 Blob 的 Blob 參考。 接著會使用 DeleteIfExistsAsync
方法刪除 Blob。