Sdílet prostřednictvím


Ukládání a přístup k datům ve službě Azure Storage z Xamarin.Forms

Azure Storage je škálovatelné cloudové úložiště, které se dá použít k ukládání nestrukturovaných a strukturovaných dat. Tento článek ukazuje, jak používat Xamarin.Forms k ukládání textových a binárních dat ve službě Azure Storage a jak získat přístup k datům.

Azure Storage poskytuje čtyři služby úložiště:

  • Blob Storage Objekt blob může být textová nebo binární data, jako jsou zálohy, virtuální počítače, mediální soubory nebo dokumenty.
  • Table Storage je úložiště atributů klíče NoSQL.
  • Queue Storage je služba zasílání zpráv pro zpracování pracovních postupů a komunikaci mezi cloudovými službami.
  • File Storage poskytuje sdílené úložiště pomocí protokolu SMB.

Jsou dva druhy účtů úložiště:

  • Účty úložiště pro obecné účely poskytují přístup ke službám Azure Storage z jednoho účtu.
  • Účet blob storage je specializovaný účet úložiště pro ukládání objektů blob. Tento typ účtu se doporučuje, když potřebujete ukládat jenom data objektů blob.

Tento článek a doprovodná ukázková aplikace demonstrují nahrávání obrázků a textových souborů do úložiště objektů blob a jejich stahování. Kromě toho také ukazuje načtení seznamu souborů z úložiště objektů blob a odstranění souborů.

Další informace o službě Azure Storage najdete v tématu Úvod do služby Storage.

Poznámka:

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.

Úvod do služby Blob Storage

Úložiště objektů blob se skládá ze tří součástí, které jsou znázorněny v následujícím diagramu:

Koncepce Blob Storage

Veškerý přístup ke službě Azure Storage je prostřednictvím účtu úložiště. Účet úložiště může obsahovat neomezený počet kontejnerů a kontejner může obsahovat neomezený počet objektů blob až do limitu kapacity účtu úložiště.

Objekt blob je soubor libovolného typu a velikosti. Azure Storage podporuje tři různé typy objektů blob:

  • Objekty blob bloku jsou optimalizované pro streamování a ukládání cloudových objektů a jsou dobrou volbou pro ukládání záloh, mediálních souborů, dokumentů atd. Objekty blob bloku můžou mít velikost až 195 GB.
  • Doplňovací objekty blob jsou podobné objektům blob bloku, ale jsou optimalizované pro operace připojení, jako je protokolování. Doplňovací objekty blob můžou mít velikost až 195 Gb.
  • Objekty blob stránky jsou optimalizované pro časté operace čtení a zápisu a obvykle se používají k ukládání virtuálních počítačů a jejich disků. Objekty blob stránky můžou mít velikost až 1 TB.

Poznámka:

Mějte na paměti, že účty úložiště objektů blob podporují objekty blob bloku a doplňovací objekty blob, ale ne objekty blob stránky.

Objekt blob se nahraje do Služby Azure Storage a stáhne se ze služby Azure Storage jako datový proud bajtů. Soubory proto musí být před nahráním převedeny na datový proud bajtů a po stažení se převedou zpět na původní reprezentaci.

Každý objekt uložený ve službě Azure Storage má jedinečnou adresu URL. Název účtu úložiště tvoří subdoménu této adresy a kombinace subdomény a názvu domény tvoří koncový bod pro účet úložiště. Pokud má například váš účet úložiště název mystorageaccount, výchozí koncový bod objektu blob pro účet úložiště je https://mystorageaccount.blob.core.windows.net.

Adresa URL pro přístup k objektu v účtu úložiště je sestavena připojením umístění objektu v účtu úložiště ke koncovému bodu. Například adresa objektu blob bude mít formát https://mystorageaccount.blob.core.windows.net/mycontainer/myblob.

Nastavení

Proces integrace účtu Azure Storage do Xamarin.Forms aplikace je následující:

  1. Vytvořte si účet úložiště. Další informace najdete v článku o vytvoření účtu úložiště.
  2. Přidejte do aplikace klientskou knihovnu Xamarin.Forms Azure Storage.
  3. Nakonfigurujte připojovací řetězec úložiště. Další informace najdete v tématu Připojení pro Azure Storage.
  4. Přidejte using direktivy pro třídy, které budou přistupovat ke službě Azure Storage, direktivy pro Microsoft.WindowsAzure.Storage obory názvů a Microsoft.WindowsAzure.Storage.Blob obory názvů.

Připojení k Azure Storage

Každý požadavek na prostředky účtu úložiště se musí ověřit. I když je možné nakonfigurovat objekty blob tak, aby podporovaly anonymní ověřování, existují dva hlavní přístupy, které může aplikace použít k ověření pomocí účtu úložiště:

  • Sdílený klíč. Tento přístup používá název účtu Azure Storage a klíč účtu pro přístup ke službám úložiště. Účet úložiště má při vytváření přiřazené dva privátní klíče, které se dají použít pro ověřování pomocí sdíleného klíče.
  • Sdílený přístupový podpis. Jedná se o token, který se dá připojit k adrese URL, která umožňuje delegovaný přístup k prostředku úložiště s oprávněními, která určuje, po dobu platnosti.

Připojení řetězců je možné zadat, které obsahují ověřovací informace potřebné pro přístup k prostředkům azure Storage z aplikace. Kromě toho je možné nakonfigurovat připojovací řetězec pro připojení k emulátoru úložiště Azure ze sady Visual Studio.

Poznámka:

Azure Storage podporuje protokol HTTP a HTTPS v připojovací řetězec. Doporučuje se ale použít HTTPS.

Připojení do emulátoru služby Azure Storage

Emulátor úložiště Azure poskytuje místní prostředí, které emuluje služby Azure Blob, Queue a Table Services pro účely vývoje.

Pro připojení k emulátoru úložiště Azure byste měli použít následující připojovací řetězec:

UseDevelopmentStorage=true

Další informace o emulátoru úložiště Azure najdete v tématu Použití emulátoru úložiště Azure pro vývoj a testování.

Připojení do služby Azure Storage pomocí sdíleného klíče

Pro připojení ke službě Azure Storage pomocí sdíleného klíče by se měl použít následující formát připojovací řetězec:

DefaultEndpointsProtocol=[http|https];AccountName=myAccountName;AccountKey=myAccountKey

myAccountName měla by být nahrazena názvem vašeho účtu úložiště a myAccountKey měla by být nahrazena jedním z vašich dvou přístupových klíčů k účtu.

Poznámka:

Při ověřování pomocí sdíleného klíče se název účtu a klíč účtu distribuují každé osobě, která používá vaši aplikaci, což zajistí úplný přístup pro čtení a zápis k účtu úložiště. Proto používejte ověřování pomocí sdíleného klíče pouze pro účely testování a nikdy nedistribuujte klíče jiným uživatelům.

Připojení do služby Azure Storage pomocí sdíleného přístupového podpisu

Pro připojení ke službě Azure Storage pomocí sdíleného přístupového podpisu by se měl použít následující formát připojovací řetězec:

BlobEndpoint=myBlobEndpoint;SharedAccessSignature=mySharedAccessSignature

myBlobEndpoint měla by být nahrazena adresou URL koncového bodu objektu blob a mySharedAccessSignature měla by být nahrazena vaším SAS. SAS poskytuje protokol, koncový bod služby a přihlašovací údaje pro přístup k prostředku.

Poznámka:

Pro produkční aplikace se doporučuje ověřování SAS. V produkční aplikaci by se ale sas měl načíst z back-endové služby na vyžádání, a ne zkompilovat ji.

Další informace o sdílených přístupových podpisech najdete v tématu Použití sdílených přístupových podpisů (SAS).

Vytvoření kontejneru

Metoda GetContainer se používá k načtení odkazu na pojmenovaný kontejner, který se pak dá použít k načtení objektů blob z kontejneru nebo k přidání objektů blob do kontejneru. Následující příklad kódu ukazuje metodu GetContainer :

static CloudBlobContainer GetContainer(ContainerType containerType)
{
  var account = CloudStorageAccount.Parse(Constants.StorageConnection);
  var client = account.CreateCloudBlobClient();
  return client.GetContainerReference(containerType.ToString().ToLower());
}

Metoda CloudStorageAccount.Parse parsuje připojovací řetězec a vrátí CloudStorageAccount instanci, která představuje účet úložiště. Instance CloudBlobClient , která se používá k načtení kontejnerů a objektů blob, se pak vytvoří metodou CreateCloudBlobClient . Metoda GetContainerReference načte zadaný kontejner jako CloudBlobContainer instanci předtím, než se vrátí do volající metody. V tomto příkladu je název kontejneru hodnota výčtu ContainerType převedená na řetězec malými písmeny.

Poznámka:

Názvy kontejnerů musí být malými písmeny a musí začínat písmenem nebo číslicí. Kromě toho můžou obsahovat jenom písmena, číslice a znak pomlčky a musí mít délku 3 až 63 znaků.

Metoda GetContainer je vyvolána následujícím způsobem:

var container = GetContainer(containerType);

Instanci CloudBlobContainer pak můžete použít k vytvoření kontejneru, pokud ještě neexistuje:

await container.CreateIfNotExistsAsync();

Ve výchozím nastavení je nově vytvořený kontejner soukromý. To znamená, že pro načtení objektů blob z kontejneru je nutné zadat přístupový klíč úložiště. Informace o vytváření objektů blob ve veřejném kontejneru najdete v tématu Vytvoření kontejneru.

Nahrání dat do kontejneru

Metoda UploadFileAsync se používá k nahrání datového proudu bajtů do úložiště objektů blob a ukazuje se v následujícím příkladu kódu:

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;
}

Po načtení odkazu na kontejner vytvoří metoda kontejner, pokud ještě neexistuje. Vytvoří se nový Guid název objektu blob, který bude fungovat jako jedinečný název objektu blob a jako instance se načte CloudBlockBlob odkaz na blok objektů blob. Stream dat se pak nahraje do objektu UploadFromStreamAsync blob pomocí metody, která vytvoří objekt blob, pokud ještě neexistuje, nebo ho přepíše, pokud existuje.

Před nahráním souboru do úložiště objektů blob pomocí této metody musí být nejprve převeden na bajtový datový proud. To je znázorněno v následujícím příkladu kódu:

var byteData = Encoding.UTF8.GetBytes(text);
uploadedFilename = await AzureStorage.UploadFileAsync(ContainerType.Text, new MemoryStream(byteData));

text Data se převedou na bajtové pole, které se pak zabalí jako datový proud předaný metoděUploadFileAsync.

Stahování dat z kontejneru

Metoda GetFileAsync se používá ke stažení dat objektů blob ze služby Azure Storage a ukazuje se v následujícím příkladu kódu:

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;
}

Po načtení odkazu na kontejner načte metoda odkaz na objekt blob pro uložená data. Pokud objekt blob existuje, jeho vlastnosti se načtou metodou FetchAttributesAsync . Vytvoří se bajtové pole správné velikosti a objekt blob se stáhne jako pole bajtů, které se vrátí do volající metody.

Po stažení dat bajtů objektu blob je nutné je převést na původní reprezentaci. To je znázorněno v následujícím příkladu kódu:

var byteData = await AzureStorage.GetFileAsync(ContainerType.Text, uploadedFilename);
string text = Encoding.UTF8.GetString(byteData);

Pole bajtů se načte ze služby Azure Storage metodou GetFileAsync předtím, než se převede zpět na řetězec s kódováním UTF8.

Výpis dat v kontejneru

Metoda GetFilesListAsync se používá k načtení seznamu objektů blob uložených v kontejneru a je znázorněna v následujícím příkladu kódu:

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;
}

Po načtení odkazu na kontejner použije metoda kontejneru ListBlobsSegmentedAsync k načtení odkazů na objekty blob v kontejneru. Výsledky vrácené metodou ListBlobsSegmentedAsync jsou výčtu, zatímco BlobContinuationToken instance není null. Každý objekt blob se přetypuje z vráceného IListBlobItem objektu CloudBlockBlobName blob do vlastnosti objektu blob, aby se do kolekce přidala allBlobsList hodnota. BlobContinuationToken Jakmile je nullinstance, vrátí se poslední název objektu blob a spuštění ukončí smyčku.

Odstranění dat z kontejneru

Metoda DeleteFileAsync se používá k odstranění objektu blob z kontejneru a ukazuje se v následujícím příkladu kódu:

public static async Task<bool> DeleteFileAsync(ContainerType containerType, string name)
{
  var container = GetContainer(containerType);
  var blob = container.GetBlobReference(name);
  return await blob.DeleteIfExistsAsync();
}

Po načtení odkazu na kontejner načte metoda odkaz na objekt blob pro zadaný objekt blob. Objekt blob se pak odstraní pomocí DeleteIfExistsAsync metody.