共用方式為


在 Azure 儲存體 中儲存和存取數據Xamarin.Forms

Azure 儲存體 是可調整的雲端記憶體解決方案,可用來儲存非結構化和結構化數據。 本文示範如何使用 將Xamarin.Forms文字和二進位數據儲存在 Azure 儲存體,以及如何存取數據。

Azure 儲存體 提供四個記憶體服務:

  • Blob 儲存體。 Blob 可以是文字或二進位數據,例如備份、虛擬機、媒體檔案或檔。
  • 數據表 儲存體 是 NoSQL 索引鍵屬性存放區。
  • 佇列 儲存體 是一種傳訊服務,可用於雲端服務之間的工作流程處理和通訊。
  • 檔案 儲存體 使用SMB通訊協定提供共用記憶體。

記憶體帳戶有兩種類型:

  • 一般用途的記憶體帳戶可讓您從單一帳戶存取 Azure 儲存體 服務。
  • Blob 記憶體帳戶是用來儲存 Blob 的特殊記憶體帳戶。 當您只需要儲存 Blob 數據時,建議使用此帳戶類型。

本文和隨附的範例應用程式示範如何將影像和文本檔上傳至 Blob 記憶體,以及下載它們。 此外,它也會示範如何從 Blob 記憶體擷取檔案清單,以及刪除檔案。

如需 Azure 儲存體 的詳細資訊,請參閱 儲存體 簡介。

注意

如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

Blob 儲存體 簡介

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應用程式中的程式如下:

  1. 建立儲存體帳戶。 如需詳細資訊,請參閱建立儲存體帳戶
  2. Azure 儲存體客戶端連結庫新增至Xamarin.Forms應用程式。
  3. 設定記憶體 連接字串。 如需詳細資訊,請參閱 連線 Azure 儲存體
  4. 將和 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 的參考。 當 實例不是 nullBlobContinuationToken,會列舉 方法傳ListBlobsSegmentedAsync回的結果。 每個 Blob 都會從 傳回 IListBlobItemCloudBlockBlob 轉換成 ,以便存取 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。