Dela via


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

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, Coldeller Archive. Om du vill ange åtkomstnivån till Coldmå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:

Se även

  • 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.