Ukládání a přístup k datům v Azure Storage zXamarin.Forms
Azure Storage je škálovatelné řešení cloudového úložiště, které je možné použít k ukládání nestrukturovaných a strukturovaných dat. Tento článek ukazuje, jak použít k ukládání textových a binárních dat Azure Storage a jak Xamarin.Forms k datům přistupovat.
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ě typu klíč-atribut 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 Azure Storage službám z jednoho účtu.
- Účet úložiště Blob je specializovaný účet úložiště pro ukládání objektů blob. Tento typ účtu se doporučuje, když potřebujete jenom ukládat data objektů blob.
Tento článek a doprovodná ukázková aplikace předvede nahrání obrázků a textových souborů do úložiště objektů blob a jejich stažení. Kromě toho ukazuje také načtení seznamu souborů z úložiště objektů blob a odstranění souborů.
Další informace o Azure Storage najdete v tématu Úvod do 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ří komponent, které jsou znázorněny v následujícím diagramu:

Veškerý přístup k 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 mohou mít velikost až 195 GB.
- Doplňovací objekty blob se podobají objektům blob bloku, ale jsou optimalizované pro operace připojení, jako je protokolování. Doplňovací objekty blob mohou 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 mohou mít velikost až 1TB.
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 Azure Storage a stáhne z Azure Storage jako datový proud bajtů. Proto musí být soubory před nahrávce převedeny na datový proud bajtů a po stažení převedeny zpět na původní reprezentaci.
Každý objekt uložený v Azure Storage má jedinečnou adresu URL. Název účtu úložiště tvoří subdoménu této adresy a kombinace názvu subdomény a domény tvoří koncový bod pro účet úložiště. Pokud se například váš účet úložiště jmenuje mystorageaccount,výchozí koncový bod objektu blob pro účet úložiště je .
Adresa URL pro přístup k objektu v účtu úložiště se sestaví 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í:
- Vytvoření účtu úložiště Další informace najdete v článku o vytvoření účtu úložiště.
- Přidejte Azure Storage klientskou knihovnu do aplikace.
- Nakonfigurujte připojovací řetězec úložiště. Další informace najdete v tématu Připojení k Azure Storage.
- Přidejte
usingdirektivy proMicrosoft.WindowsAzure.StorageMicrosoft.WindowsAzure.Storage.Blobobory názvů a do tříd, které budou přistupovat Azure Storage.
Připojení k Azure Storage
Každý požadavek na prostředky účtu úložiště musí být ověřený. Objekty blob je možné nakonfigurovat tak, aby podporovaly anonymní ověřování, ale 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ě. Účtu úložiště se při vytváření přiřadí dva privátní klíče, které je možné použít k ověřování pomocí sdíleného klíče.
- Sdílený přístupový podpis. Jedná se o token, který lze 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, po kterou je platný.
Je možné zadat připojovací řetězce, které zahrnují ověřovací informace potřebné Azure Storage prostředkům z aplikace. Kromě toho je možné nakonfigurovat připojovací řetězec pro připojení k emulátoru úložiště Azure z Visual Studio.
Poznámka
Azure Storage v připojovacím řetězci podporuje HTTP a HTTPS. Doporučuje se ale používat protokol HTTPS.
Připojení k Azure Storage Emulator
Emulátor úložiště Azure poskytuje místní prostředí, které emuluje služby Azure Blob, Queue a Table Service pro účely vývoje.
Pro připojení k emulátoru úložiště Azure by se měl 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í k Azure Storage pomocí sdíleného klíče
Následující formát připojovacího řetězce by se měl použít pro připojení Azure Storage pomocí sdíleného klíče:
DefaultEndpointsProtocol=[http|https];AccountName=myAccountName;AccountKey=myAccountKey
myAccountName by měl být nahrazen názvem vašeho účtu úložiště a měl by být nahrazen jedním z myAccountKey vašich dvou přístupových klíčů k účtu.
Poznámka
Při použití ověřování pomocí sdíleného klíče se název vašeho účtu a klíč účtu distribuují každé osobě, která vaši aplikaci používá. Tím se 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 ne distribuujte klíče ostatním uživatelům.
Připojení k Azure Storage pomocí sdíleného přístupového podpisu
Následující formát připojovacího řetězce by se měl použít pro připojení Azure Storage pomocí SAS:
BlobEndpoint=myBlobEndpoint;SharedAccessSignature=mySharedAccessSignature
myBlobEndpoint byste měli nahradit adresou URL koncového bodu objektu blob a měli mySharedAccessSignature byste ji nahradit sas. SAS poskytuje protokol, koncový bod služby a přihlašovací údaje pro přístup k prostředku.
Poznámka
Ověřování SAS se doporučuje pro produkční aplikace. V produkční aplikaci by se ale SAS měl načíst z back-endové služby na vyžádání, místo aby byl součástí aplikace.
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 se používá k načtení odkazu na pojmenovaný kontejner, který se pak může použít k načtení objektů blob z kontejneru nebo k přidání objektů GetContainer blob do kontejneru. Následující příklad kódu ukazuje GetContainer metodu :
static CloudBlobContainer GetContainer(ContainerType containerType)
{
var account = CloudStorageAccount.Parse(Constants.StorageConnection);
var client = account.CreateCloudBlobClient();
return client.GetContainerReference(containerType.ToString().ToLower());
}
Metoda CloudStorageAccount.Parse analyzuje připojovací řetězec a vrátí CloudStorageAccount instanci, která představuje účet úložiště. Instance, která se používá k načtení kontejnerů a objektů blob, se pak CloudBlobClient vytvoří pomocí metody CreateCloudBlobClient . Metoda GetContainerReference načte zadaný kontejner jako instanci CloudBlobContainer předtím, než se vrátí volající metodě. V tomto příkladu je název kontejneru hodnota ContainerType výčtu převedená na řetězec s malými písmeny.
Poznámka
Názvy kontejnerů musí být malými písmeny a musí začínát písmenem nebo číslem. Kromě toho mohou obsahovat pouze písmena, číslice a znak pomlčky a musí být dlouhý 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 privátní. To znamená, že k načtení objektů blob z kontejneru je nutné zadat přístupový klíč k úložišti. Informace o vytváření objektů blob v rámci kontejneru jako veřejných najdete v tématu Vytvoření kontejneru.
Nahrání dat do kontejneru
Metoda UploadFileAsync se používá k nahrání streamu dat bajtů do úložiště objektů blob a je znázorněna 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 metoda vytvoří kontejner, pokud ještě neexistuje. Vytvoří se nový Guid , který bude fungovat jako jedinečný název objektu blob, a odkaz na blok objektu BLOB se načte jako CloudBlockBlob instance. Datový proud dat se pak nahraje do objektu BLOB pomocí UploadFromStreamAsync metody, která vytvoří objekt blob, pokud ještě neexistuje, nebo ho přepíše, pokud existuje.
Než bude možné soubor odeslat do úložiště objektů BLOB pomocí této metody, musí být nejprve převeden na datový proud bajtů. 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));
textData jsou převedena na bajtové pole, které je poté zabaleno jako datový proud, který je předán UploadFileAsync metodě.
Stahování dat z kontejneru
GetFileAsyncmetoda se používá ke stahování dat objektu blob z Azure Storage a je zobrazená 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 metoda načte odkaz na objekt BLOB pro uložená data. Pokud objekt BLOB existuje, jeho vlastnosti jsou načteny FetchAttributesAsync metodou. Vytvoří se bajtové pole se správnou velikostí a objekt BLOB se stáhne jako pole bajtů, které se vrátí volající metodě.
Po stažení bajtových dat objektu BLOB se musí převést na jeho původní reprezentace. 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ů je načteno z Azure Storage GetFileAsync metodou, před převodem zpět na řetězec kódovaný pomocí UTF8.
Výpis dat v kontejneru
GetFilesListAsyncMetoda se používá k načtení seznamu objektů BLOB uložených v kontejneru a zobrazí se 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 metoda pomocí ListBlobsSegmentedAsync metody kontejneru načte odkazy na objekty BLOB v rámci kontejneru. Výsledky vrácené metodou jsou vyhodnoceny, ListBlobsSegmentedAsync dokud instance není BlobContinuationTokennull . Každý objekt BLOB je přetypování z vráceného IListBlobItem na a CloudBlockBlob v pořadí přístup k Name vlastnosti objektu blob, před tím, než je hodnota přidána do allBlobsList kolekce. Po BlobContinuationToken výskytu instance se null vrátí poslední název objektu BLOB a spuštění ukončí smyčku.
Odstranění dat z kontejneru
DeleteFileAsyncMetoda se používá k odstranění objektu BLOB z kontejneru a je zobrazená 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 metoda načte odkaz na objekt BLOB pro zadaný objekt BLOB. Objekt BLOB se pak odstraní pomocí DeleteIfExistsAsync metody.
Stažení ukázky