Rychlý start: Nahrávání, stahování a výpis objektů blob pomocí Go

V tomto rychlém startu zjistíte, jak pomocí programovacího jazyka Go nahrávat, stahovat a vypisovat objekty blob bloku v kontejneru v úložišti objektů blob v Azure.

Požadavky

Pokud chcete získat přístup k Azure Storage, budete potřebovat předplatné Azure. Pokud ještě předplatné nemáte, vytvořte si bezplatný účet před tím, než začnete.

Veškerý přístup k Azure Storage probíhá prostřednictvím účtu úložiště. V tomto rychlém startu vytvořte účet úložiště pomocí Azure Portal, Azure PowerShell nebo Azure CLI. Nápovědu k vytvoření účtu úložiště najdete v tématu Vytvoření účtu úložiště.

Ujistěte se, že máte nainstalované následující další požadavky:

  • Go 1.8 nebo vyšší

  • Azure Storage Blob SDK for Gopomocí následujícího příkazu:

    go get -u github.com/Azure/azure-storage-blob-go/azblob

    Poznámka

    Při práci se sadou SDK se ujistěte, že v adrese URL zakašlujete velká písmena, abyste se vyhnuli problémům s Azure importem souvisejícím s velkými písmeny. V příkazy importu Azure také napište velká a velká písmena.

Stažení ukázkové aplikace

Ukázková aplikace použitá v tomto rychlém startu je základní aplikace v jazyce Go.

Pomocí gitu stáhněte kopii aplikace do vývojového prostředí.

git clone https://github.com/Azure-Samples/storage-blobs-go-quickstart 

Tento příkaz naklonuje úložiště do vaší místní složky gitu. Pokud chcete otevřít ukázku v jazyce Go pro úložiště objektů blob, vyhledejte soubor storage-quickstart.go.

Zkopírování přihlašovacích údajů z webu Azure Portal

Ukázková aplikace potřebuje autorizovat přístup k vašemu účtu úložiště. Zadejte přihlašovací údaje účtu úložiště do aplikace ve formě připojovacího řetězce. Zobrazení přihlašovacích údajů účtu úložiště:

  1. Do Azure Portal přejít na účet úložiště.

  2. V části Nastavení v přehledu účtu úložiště vyberte přístupové klíče a zobrazte klíče pro přístup k účtu a připojovací řetězec.

  3. Poznamenejte si název svého účtu úložiště, který budete potřebovat k autorizaci.

  4. Vyhledejte klíčovou hodnotu v části Klíč1 a výběrem Kopírovat Zkopírujte klíč účtu.

    Snímek obrazovky ukazující zkopírování klíče účtu z webu Azure Portal

Konfigurace připojovacího řetězce úložiště

Toto řešení vyžaduje, aby název a klíč vašeho účtu úložiště byly bezpečně uložené v místních proměnných prostředí počítače, na kterém je ukázka spuštěná. V závislosti na operačním systému vytvořte proměnné prostředí pomocí jednoho z následujících příkladů.

export AZURE_STORAGE_ACCOUNT="<youraccountname>"
export AZURE_STORAGE_ACCESS_KEY="<youraccountkey>"

Spuštění ukázky

Ukázka vytvoří v aktuální složce testovací soubor, nahraje ho do úložiště objektů blob, vypíše objekty blob v kontejneru a stáhne soubor do vyrovnávací paměti.

Ukázku spustíte následujícím příkazem:

go run storage-quickstart.go

Následující výstup je příkladem výstupu vráceného po spuštění aplikace:

Azure Blob storage quick start sample
Creating a container named quickstart-5568059279520899415
Creating a dummy file to test the upload and download
Uploading the file with blob name: 630910657703031215
Blob name: 630910657703031215
Downloaded the blob: hello world
this is a blob
Press the enter key to delete the sample files, example container, and exit the application.

Když budete pokračovat stisknutím klávesy, ukázkový program odstraní kontejner úložiště i soubory.

Tip

K zobrazení souborů v úložišti objektů blob můžete použít také nástroj, jako je Průzkumník služby Azure Storage. Průzkumník služby Azure Storage je bezplatný nástroj pro více platforem, který umožňuje přístup k informacím o účtu úložiště.

Vysvětlení vzorového kódu

Dále si projdeme vzorový kód, abyste pochopili, jak funguje.

Vytvoření objektů ContainerURL a BlobURL

Nejprve vytvořte odkazy na objekty ContainerURL a BlobURL používané pro přístup k úložišti objektů blob a jejich správu. Tyto objekty nabízejí rozhraní API nízké úrovně, jako jsou Create, Upload a Download, pro vydávání rozhraní REST API.

  • K uložení přihlašovacích údajů použijte strukturu SharedKeyCredential.

  • Vytvořte Kanál s použitím těchto přihlašovacích údajů a možností. Kanál určuje například zásady opakování, protokolování, deserializaci datových částí odpovědí HTTP a další.

  • Vytvořte nové instance objektů ContainerURL a BlobURL pro spouštění operací s kontejnery (Create) a objekty blob (Upload a Download).

Jakmile budete mít objekt ContainerURL, můžete vytvořit instanci objektu BlobURL odkazující na objekt blob a provádět například operace nahrávání, stahování a kopírování.

Důležité

Názvy kontejnerů musí být malými písmeny. Další informace o pojmenování kontejnerů a objektů blob najdete v tématu Názvy kontejnerů, objektů blob a metadat a odkazování na ně.

V této části vytvoříte nový kontejner. Kontejner má název quickstartblobs-[náhodný_řetězec].

// From the Azure portal, get your storage account name and key and set environment variables.
accountName, accountKey := os.Getenv("AZURE_STORAGE_ACCOUNT"), os.Getenv("AZURE_STORAGE_ACCESS_KEY")
if len(accountName) == 0 || len(accountKey) == 0 {
    log.Fatal("Either the AZURE_STORAGE_ACCOUNT or AZURE_STORAGE_ACCESS_KEY environment variable is not set")
}

// Create a default request pipeline using your storage account name and account key.
credential, err := azblob.NewSharedKeyCredential(accountName, accountKey)
if err != nil {
    log.Fatal("Invalid credentials with error: " + err.Error())
}
p := azblob.NewPipeline(credential, azblob.PipelineOptions{})

// Create a random string for the quick start container
containerName := fmt.Sprintf("quickstart-%s", randomString())

// From the Azure portal, get your storage account blob service URL endpoint.
URL, _ := url.Parse(
    fmt.Sprintf("https://%s.blob.core.windows.net/%s", accountName, containerName))

// Create a ContainerURL object that wraps the container URL and a request
// pipeline to make requests.
containerURL := azblob.NewContainerURL(*URL, p)

// Create the container
fmt.Printf("Creating a container named %s\n", containerName)
ctx := context.Background() // This example uses a never-expiring context
_, err = containerURL.Create(ctx, azblob.Metadata{}, azblob.PublicAccessNone)
handleErrors(err)

Nahrání objektů blob do kontejneru

Úložiště objektů blob podporuje objekty blob bloku, doplňovací objekty blob a objekty blob stránky. Nejčastěji používané jsou objekty blob bloku, které se používají také v tomto rychlém startu.

Pokud chcete do objektu blob nahrát soubor, otevřete soubor pomocí příkazu os.Open. Pak můžete soubor nahrát do zadané cesty pomocí některého z rozhraní REST API: Upload (PutBlob), StageBlock nebo CommitBlockList (PutBlock nebo PutBlockList).

Sada SDK případně nabízí rozhraní API vysoké úrovně založená na rozhraních REST API nízké úrovně. Příkladem je funkce UploadFileToBlockBlob, která používá operace StageBlock (PutBlock) k souběžnému nahrání souboru po částech za účelem optimalizace propustnosti. Pokud je soubor menší než 256 MB, použije místo toho operaci Upload (PutBlob) k dokončení přenosu v rámci jediné transakce.

Následující příklad nahraje soubor do kontejneru quickstartblobs-[náhodný_řetězec].

// Create a file to test the upload and download.
fmt.Printf("Creating a dummy file to test the upload and download\n")
data := []byte("hello world this is a blob\n")
fileName := randomString()
err = ioutil.WriteFile(fileName, data, 0700)
handleErrors(err)

// Here's how to upload a blob.
blobURL := containerURL.NewBlockBlobURL(fileName)
file, err := os.Open(fileName)
handleErrors(err)

// You can use the low-level Upload (PutBlob) API to upload files. Low-level APIs are simple wrappers for the Azure Storage REST APIs.
// Note that Upload can upload up to 256MB data in one shot. Details: https://docs.microsoft.com/rest/api/storageservices/put-blob
// To upload more than 256MB, use StageBlock (PutBlock) and CommitBlockList (PutBlockList) functions. 
// Following is commented out intentionally because we will instead use UploadFileToBlockBlob API to upload the blob
// _, err = blobURL.Upload(ctx, file, azblob.BlobHTTPHeaders{ContentType: "text/plain"}, azblob.Metadata{}, azblob.BlobAccessConditions{})
// handleErrors(err)

// The high-level API UploadFileToBlockBlob function uploads blocks in parallel for optimal performance, and can handle large files as well.
// This function calls StageBlock/CommitBlockList for files larger 256 MBs, and calls Upload for any file smaller
fmt.Printf("Uploading the file with blob name: %s\n", fileName)
_, err = azblob.UploadFileToBlockBlob(ctx, file, blobURL, azblob.UploadToBlockBlobOptions{
    BlockSize: 4 * 1024 * 1024,
    Parallelism: 16})
handleErrors(err)

Seznam objektů blob v kontejneru

Seznam souborů v kontejneru získáte pomocí metody ListBlobs s použitím objektu ContainerURL. Metoda ListBlobs vrací jeden segment objektů blob (až 5 000) počínaje zadanou značkou. Pokud chcete začít výčet od začátku, použijte prázdnou značku. Názvy objektů blob se vrací ve slovníkovém pořadí. Po získání segmentu ho zpracujte a pak znovu zavolejte metodu ListBlobs a předejte jí dříve vrácenou značku.

// List the container that we have created above
fmt.Println("Listing the blobs in the container:")
for marker := (azblob.Marker{}); marker.NotDone(); {
    // Get a result segment starting with the blob indicated by the current Marker.
    listBlob, err := containerURL.ListBlobsFlatSegment(ctx, marker, azblob.ListBlobsSegmentOptions{})
    handleErrors(err)

    // ListBlobs returns the start of the next segment; you MUST use this to get
    // the next segment (after processing the current result segment).
    marker = listBlob.NextMarker

    // Process the blobs returned in this result segment (if the segment is empty, the loop body won't execute)
    for _, blobInfo := range listBlob.Segment.BlobItems {
        fmt.Print("    Blob name: " + blobInfo.Name + "\n")
    }
}

Stažení objektu blob

Objekty blob můžete stáhnout pomocí funkce nízké úrovně Download s použitím objektu BlobURL. Tato funkce vrátí strukturu DownloadResponse. Spuštěním funkce Body pro strukturu získáte datový proud RetryReader pro čtení dat. Pokud se připojení při čtení nezdaří, vytvoří další požadavky na opětovné navázání připojení a pokračování ve čtení. Pokud zadáte RetryReaderOptions s vlastností MaxRetryRequests nastavenou na hodnotu 0 (výchozí hodnota), vrátí se původní text odpovědi bez opakování. Alternativně můžete kód zjednodušit použitím rozhraní API vysoké úrovně DownloadBlobToBuffer nebo DownloadBlobToFile.

Následující kód stáhne objekt blob pomocí funkce Download. Obsah objektu blob se zapíše do vyrovnávací paměti a zobrazí se v konzole.

// Here's how to download the blob
downloadResponse, err := blobURL.Download(ctx, 0, azblob.CountToEnd, azblob.BlobAccessConditions{}, false)

// NOTE: automatically retries are performed if the connection fails
bodyStream := downloadResponse.Body(azblob.RetryReaderOptions{MaxRetryRequests: 20})

// read the body into a buffer
downloadedData := bytes.Buffer{}
_, err = downloadedData.ReadFrom(bodyStream)
handleErrors(err)

Vyčištění prostředků

Pokud už nepotřebujete objekty blob nahrané v rámci tohoto rychlého startu, můžete celý kontejner odstranit pomocí metody Delete.

// Cleaning up the quick start by deleting the container and the file created locally
fmt.Printf("Press enter key to delete the sample files, example container, and exit the application.\n")
bufio.NewReader(os.Stdin).ReadBytes('\n')
fmt.Printf("Cleaning up.\n")
containerURL.Delete(ctx, azblob.ContainerAccessConditions{})
file.Close()
os.Remove(fileName)

Zdroje informací pro vývoj aplikací v jazyce Go s využitím objektů blob

Prohlédněte si tyto další zdroje informací o vývoji v jazyce Go s využitím úložiště objektů blob:

Další kroky

V tomto rychlém startu jste zjistili, jak přenášet soubory mezi místním diskem a úložištěm objektů blob v Azure pomocí jazyka Go. Další informace o sadě Azure Storage Blob SDK najdete ve zdrojovém kódu a referenčních materiálech k rozhraní API.