Ladda upp en blob med .NET
Den här artikeln visar hur du laddar upp en blob med hjälp av Azure Storage-klientbiblioteket för .NET. Du kan ladda upp data till en blockblob från en filsökväg, en ström, ett binärt objekt eller en textsträng. Du kan också öppna en blobström och skriva till den eller ladda upp stora blobar i block.
Förutsättningar
- Azure-prenumeration – skapa en kostnadsfritt
- Azure Storage-konto – skapa ett lagringskonto
- Senaste .NET SDK för operativsystemet. Se till att hämta SDK:et och inte körningen.
Konfigurera din miljö
Om du inte har ett befintligt projekt visar det här avsnittet hur du konfigurerar ett projekt för att arbeta med Azure Blob Storage-klientbiblioteket för .NET. Stegen omfattar paketinstallation, tillägg av using
direktiv och skapande av ett auktoriserat klientobjekt. Mer information finns i Kom igång med Azure Blob Storage och .NET.
Installera paket
Från projektkatalogen installerar du paket för Azure Blob Storage- och Azure Identity-klientbiblioteken med hjälp av dotnet add package
kommandot . Azure.Identity-paketet behövs för lösenordslösa anslutningar till Azure-tjänster.
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity
Lägga till using
direktiv
Lägg till dessa using
direktiv överst i kodfilen:
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
Vissa kodexempel i den här artikeln kan kräva ytterligare using
direktiv.
Skapa ett klientobjekt
Om du vill ansluta en app till Blob Storage skapar du en instans av BlobServiceClient. I följande exempel visas hur du skapar ett klientobjekt med hjälp av DefaultAzureCredential
för auktorisering:
public BlobServiceClient GetBlobServiceClient(string accountName)
{
BlobServiceClient client = new(
new Uri($"https://{accountName}.blob.core.windows.net"),
new DefaultAzureCredential());
return client;
}
Du kan registrera en tjänstklient för beroendeinmatning i en .NET-app.
Du kan också skapa klientobjekt för specifika containrar eller blobar. Mer information om hur du skapar och hanterar klientobjekt finns i Skapa och hantera klientobjekt som interagerar med dataresurser.
Auktorisering
Auktoriseringsmekanismen måste ha de behörigheter som krävs för att ladda upp en blob. För auktorisering med Microsoft Entra-ID (rekommenderas) behöver du den inbyggda rollen Storage Blob Data Contributor eller senare. Mer information finns i auktoriseringsvägledningen för Put Blob (REST API) och Put Block (REST API).
Ladda upp data till en blockblob
Du kan använda någon av följande metoder för att ladda upp data till en blockblob:
När du använder dessa uppladdningsmetoder kan klientbiblioteket anropa antingen Put Blob eller en serie Put Block-anrop följt av Placera blockeringslista. Det här beteendet beror på objektets övergripande storlek och hur dataöverföringsalternativen anges.
Om du vill öppna en dataström i Blob Storage och skriva till dataströmmen använder du någon av följande metoder:
Ladda upp en blockblob från en lokal filsökväg
I följande exempel laddas en blockblob upp från en lokal filsökväg:
public static async Task UploadFromFileAsync(
BlobContainerClient containerClient,
string localFilePath)
{
string fileName = Path.GetFileName(localFilePath);
BlobClient blobClient = containerClient.GetBlobClient(fileName);
await blobClient.UploadAsync(localFilePath, true);
}
Ladda upp en blockblob från en dataström
I följande exempel laddas en blockblob upp genom att ett Stream-objekt skapas och dataströmmen laddas upp.
public static async Task UploadFromStreamAsync(
BlobContainerClient containerClient,
string localFilePath)
{
string fileName = Path.GetFileName(localFilePath);
BlobClient blobClient = containerClient.GetBlobClient(fileName);
FileStream fileStream = File.OpenRead(localFilePath);
await blobClient.UploadAsync(fileStream, true);
fileStream.Close();
}
Ladda upp en blockblob från ett BinaryData-objekt
I följande exempel laddas en blockblob upp från ett BinaryData-objekt .
public static async Task UploadFromBinaryDataAsync(
BlobContainerClient containerClient,
string localFilePath)
{
string fileName = Path.GetFileName(localFilePath);
BlobClient blobClient = containerClient.GetBlobClient(fileName);
FileStream fileStream = File.OpenRead(localFilePath);
BinaryReader reader = new BinaryReader(fileStream);
byte[] buffer = new byte[fileStream.Length];
reader.Read(buffer, 0, buffer.Length);
BinaryData binaryData = new BinaryData(buffer);
await blobClient.UploadAsync(binaryData, true);
fileStream.Close();
}
Ladda upp en blockblob från en sträng
I följande exempel laddas en blockblob upp från en sträng:
public static async Task UploadFromStringAsync(
BlobContainerClient containerClient,
string blobName)
{
BlobClient blobClient = containerClient.GetBlobClient(blobName);
string blobContents = "Sample blob data";
await blobClient.UploadAsync(BinaryData.FromString(blobContents), overwrite: true);
}
Ladda upp till en dataström i Blob Storage
Du kan öppna en dataström i Blob Storage och skriva till den. I följande exempel skapas en zip-fil i Blob Storage och filer skrivs till den. I stället för att skapa en zip-fil i det lokala minnet finns det bara en fil i taget i minnet.
public static async Task UploadToStreamAsync(
BlobContainerClient containerClient,
string localDirectoryPath)
{
string zipFileName = Path.GetFileName(
Path.GetDirectoryName(localDirectoryPath)) + ".zip";
BlockBlobClient blockBlobClient = containerClient.GetBlockBlobClient(zipFileName);
using (Stream stream = await blockBlobClient.OpenWriteAsync(true))
{
using (ZipArchive zip = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: false))
{
foreach (var fileName in Directory.EnumerateFiles(localDirectoryPath))
{
using (var fileStream = File.OpenRead(fileName))
{
var entry = zip.CreateEntry(
Path.GetFileName(fileName), CompressionLevel.Optimal);
using (var innerFile = entry.Open())
{
await fileStream.CopyToAsync(innerFile);
}
}
}
}
}
}
Ladda upp en blockblob med konfigurationsalternativ
Du kan definiera konfigurationsalternativ för klientbibliotek när du laddar upp en blob. Dessa alternativ kan justeras för att förbättra prestanda, förbättra tillförlitligheten och optimera kostnaderna. Följande kodexempel visar hur du använder BlobUploadOptions för att definiera konfigurationsalternativ när du anropar en uppladdningsmetod.
Ange alternativ för dataöverföring vid uppladdning
Du kan konfigurera värdena i StorageTransferOptions för att förbättra prestanda för dataöverföringsåtgärder. Följande kodexempel visar hur du anger värden för StorageTransferOptions
och inkluderar alternativen som en del av en BlobUploadOptions
instans. De värden som anges i det här exemplet är inte avsedda att vara en rekommendation. Om du vill justera dessa värden korrekt måste du ta hänsyn till appens specifika behov.
public static async Task UploadWithTransferOptionsAsync(
BlobContainerClient containerClient,
string localFilePath)
{
string fileName = Path.GetFileName(localFilePath);
BlobClient blobClient = containerClient.GetBlobClient(fileName);
var transferOptions = new StorageTransferOptions
{
// Set the maximum number of parallel transfer workers
MaximumConcurrency = 2,
// Set the initial transfer length to 8 MiB
InitialTransferSize = 8 * 1024 * 1024,
// Set the maximum length of a transfer to 4 MiB
MaximumTransferSize = 4 * 1024 * 1024
};
var uploadOptions = new BlobUploadOptions()
{
TransferOptions = transferOptions
};
FileStream fileStream = File.OpenRead(localFilePath);
await blobClient.UploadAsync(fileStream, uploadOptions);
fileStream.Close();
}
Mer information om hur du justerar dataöverföringsalternativ finns i Prestandajustering för uppladdningar och nedladdningar med .NET.
Ange alternativ för överföringsverifiering vid uppladdning
Du kan ange alternativ för överföringsverifiering för att säkerställa att data laddas upp korrekt och inte har manipulerats under överföringen. Alternativ för överföringsverifiering kan definieras på klientnivå med BlobClientOptions, som tillämpar valideringsalternativ på alla metoder som anropas från en BlobClient-instans.
Du kan också åsidosätta alternativ för överföringsverifiering på metodnivå med BlobUploadOptions. I följande kodexempel visas hur du skapar ett BlobUploadOptions
objekt och anger en algoritm för att generera en kontrollsumma. Kontrollsumman används sedan av tjänsten för att verifiera dataintegriteten för det uppladdade innehållet.
public static async Task UploadWithChecksumAsync(
BlobContainerClient containerClient,
string localFilePath)
{
string fileName = Path.GetFileName(localFilePath);
BlobClient blobClient = containerClient.GetBlobClient(fileName);
var validationOptions = new UploadTransferValidationOptions
{
ChecksumAlgorithm = StorageChecksumAlgorithm.Auto
};
var uploadOptions = new BlobUploadOptions()
{
TransferValidation = validationOptions
};
FileStream fileStream = File.OpenRead(localFilePath);
await blobClient.UploadAsync(fileStream, uploadOptions);
fileStream.Close();
}
I följande tabell visas tillgängliga alternativ för kontrollsummaalgoritmen enligt definitionen i StorageChecksumAlgorithm:
Name | Värde | beskrivning |
---|---|---|
Automatiskt | 0 | Rekommenderas. Tillåter att biblioteket väljer en algoritm. Olika biblioteksversioner kan välja olika algoritmer. |
Ingen | 1 | Ingen vald algoritm. Beräkna eller begär inte kontrollsummor. |
MD5 | 2 | Standard MD5-hashalgoritm. |
StorageCrc64 | 3 | Anpassad 64-bitars CRC för Azure Storage. |
Kommentar
Om kontrollsumman som anges i begäran inte matchar kontrollsumman som beräknas av tjänsten misslyckas uppladdningen. Åtgärden görs inte igen när du använder en standardprincip för återförsök. I .NET genereras en RequestFailedException
med statuskod 400 och felkod Md5Mismatch
eller Crc64Mismatch
, beroende på vilken algoritm som används.
Ladda upp med indextaggar
Blobindextaggar kategoriserar data i ditt lagringskonto med hjälp av taggattribut för nyckelvärde. Dessa taggar indexeras automatiskt och exponeras som ett sökbart flerdimensionellt index för att enkelt hitta data. Du kan lägga till taggar i en BlobUploadOptions-instans och skicka den instansen UploadAsync
till metoden.
I följande exempel laddas en blockblob upp med indextaggar:
public static async Task UploadBlobWithTagsAsync(
BlobContainerClient containerClient,
string blobName)
{
BlobClient blobClient = containerClient.GetBlobClient(blobName);
string blobContents = "Sample blob data";
BlobUploadOptions options = new BlobUploadOptions();
options.Tags = new Dictionary<string, string>
{
{ "Sealed", "false" },
{ "Content", "image" },
{ "Date", "2020-04-20" }
};
await blobClient.UploadAsync(BinaryData.FromString(blobContents), options);
}
Ange åtkomstnivån för en blob vid uppladdning
Du kan ange åtkomstnivån för en blob vid uppladdning med hjälp av klassen BlobUploadOptions . Följande kodexempel visar hur du anger åtkomstnivån när du laddar upp en blob:
public static async Task UploadWithAccessTierAsync(
BlobContainerClient containerClient,
string localFilePath)
{
string fileName = Path.GetFileName(localFilePath);
BlockBlobClient blockBlobClient = containerClient.GetBlockBlobClient(fileName);
var uploadOptions = new BlobUploadOptions()
{
AccessTier = AccessTier.Cool
};
FileStream fileStream = File.OpenRead(localFilePath);
await blockBlobClient.UploadAsync(fileStream, uploadOptions);
fileStream.Close();
}
Det går bara att ange åtkomstnivån för blockblobar. Du kan ange åtkomstnivån för en blockblob till Hot
, Cool
, Cold
eller Archive
. Om du vill ange åtkomstnivån till Cold
måste du använda en lägsta klientbiblioteksversion på 12.15.0.
Mer information om åtkomstnivåer finns i Översikt över åtkomstnivåer.
Ladda upp en blockblob genom mellanlagringsblock och incheckning
Du kan ha större kontroll över hur du delar uppladdningar i block genom att mellanlagring av enskilda datablock manuellt. När alla block som utgör en blob mellanlagras kan du checka in dem till Blob Storage. Du kan använda den här metoden för att förbättra prestanda genom att ladda upp block parallellt.
public static async Task UploadBlocksAsync(
BlobContainerClient blobContainerClient,
string localFilePath,
int blockSize)
{
string fileName = Path.GetFileName(localFilePath);
BlockBlobClient blobClient = blobContainerClient.GetBlockBlobClient(fileName);
FileStream fileStream = File.OpenRead(localFilePath);
ArrayList blockIDArrayList = new ArrayList();
byte[] buffer;
var bytesLeft = (fileStream.Length - fileStream.Position);
while (bytesLeft > 0)
{
if (bytesLeft >= blockSize)
{
buffer = new byte[blockSize];
await fileStream.ReadAsync(buffer, 0, blockSize);
}
else
{
buffer = new byte[bytesLeft];
await fileStream.ReadAsync(buffer, 0, Convert.ToInt32(bytesLeft));
bytesLeft = (fileStream.Length - fileStream.Position);
}
using (var stream = new MemoryStream(buffer))
{
string blockID = Convert.ToBase64String(
Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()));
blockIDArrayList.Add(blockID);
await blobClient.StageBlockAsync(blockID, stream);
}
bytesLeft = (fileStream.Length - fileStream.Position);
}
string[] blockIDArray = (string[])blockIDArrayList.ToArray(typeof(string));
await blobClient.CommitBlockListAsync(blockIDArray);
}
Resurser
Mer information om hur du laddar upp blobar med hjälp av Azure Blob Storage-klientbiblioteket för .NET finns i följande resurser.
Kodexempel
REST API-åtgärder
Azure SDK för .NET innehåller bibliotek som bygger på Azure REST API, så att du kan interagera med REST API-åtgärder via välbekanta .NET-paradigm. Klientbiblioteksmetoderna för att ladda upp blobar använder följande REST API-åtgärder:
- Placera blob (REST API)
- Placera block (REST API)
Se även
- Prestandajustering för uppladdningar och nedladdningar.
- Hantera och hitta Azure Blob-data med blobindextaggar
- Använda blobindextaggar för att hantera och hitta data i Azure Blob Storage
Relaterat innehåll
- Den här artikeln är en del av utvecklarguiden för Blob Storage för .NET. Mer information finns i den fullständiga listan över utvecklarguideartiklar i Skapa din .NET-app.