Hızlı Başlangıç: Go kullanarak blobları yükleme, indirme ve listeleme

Bu hızlı başlangıçta, Azure Blob depolamadaki bir kapsayıcıda blok bloblarını karşıya yüklemek, indirmek ve listelemek için Go programlama dilini nasıl kullanabileceğinizi öğreneceksiniz.

Önkoşullar

Azure depolama 'ya erişmek için bir Azure aboneliğine sahip olmanız gerekir. Aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Tüm Azure depolama erişimi bir depolama hesabı üzerinden gerçekleşir. Bu hızlı başlangıçta Azure Portal, Azure PowerShell veya Azure CLI kullanarak bir depolama hesabı oluşturun. Depolama hesabı oluşturma konusunda yardım için bkz. depolama hesabı oluşturma.

Aşağıdaki ek önkoşulların yüklü olduğundan emin olun:

  • Git 1,8 veya üzeri

  • aşağıdaki komutu kullanarak Go için SDK Azure Depolama Blobu:

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

    Not

    AzureSDK ile çalışırken, büyük/küçük harfe ilgili içeri aktarma sorunlarından kaçınmak IÇIN URL 'de büyük harfle aldığınızdan emin olun. Ayrıca Azure içeri aktarma deyimlerinizi de büyük harfle yapın.

Örnek uygulamayı indirin:

Bu hızlı başlangıçta kullanılan örnek uygulama, temel bir Go uygulamasıdır.

Uygulamanın bir kopyasını geliştirme ortamınıza indirmek için Git'i kullanın.

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

Bu komut, depoyu yerel Git klasörünüze kopyalar. Blob depolama alanının Go örneğini açmak için, storage-quickstart.go dosyasını bulun.

Azure portalından kimlik bilgilerinizi kopyalama

Örnek uygulamanın, depolama hesabınıza erişim yetkisi vermesi gerekir. Depolama hesabı kimlik bilgilerinizi uygulamaya bağlantı dizesi biçiminde sağlayın. Depolama hesabınızın kimlik bilgilerini görüntülemek için:

  1. Azure Portal , depolama hesabınıza gidin.

  2. Depolama hesabına genel bakış ' ın Ayarlar bölümünde, hesap erişim Anahtarlarınızı ve Bağlantı dizenizi göstermek için erişim anahtarları ' nı seçin.

  3. Yetkilendirme için gerekecek olan depolama hesabınızın adını not edin.

  4. KEY1 altında anahtar değerini bulun ve hesap anahtarını kopyalamak için Kopyala ' yı seçin.

    Azure portalından hesap anahtarınızın kopyalanmasını gösteren ekran görüntüsü

Depolama bağlantı dizelerinizi yapılandırma

Bu çözüm, depolama hesabı adınızın ve anahtarınızın çözümü çalıştıran makinede yerel olarak bulunan ortam değişkenlerinde güvenli bir şekilde depolanmasını gerektirir. Ortam değişkenlerini oluşturmak için işletim sisteminize bağlı olarak aşağıdaki örneklerden birini izleyin.

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

Örneği çalıştırma

Bu örnek geçerli klasörde bir test dosyası oluşturur, test dosyasını Blob depolamaya yükler, kapsayıcıdaki blobları listeler ve dosyayı bir arabelleğe indirir.

Örneği çalıştırmak için aşağıdaki komutu yürütün:

go run storage-quickstart.go

Aşağıdaki çıktı, uygulama çalıştırılırken döndürülen çıktının bir örneğidir:

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.

Devam etmek için tuşa bastığınızda, örnek program depolama kapsayıcısını ve dosyaları siler.

İpucu

Ayrıca, Blob depolamadaki dosyaları görüntülemek için, Azure Depolama Gezgini gibi bir araç da kullanabilirsiniz. Azure Depolama Gezgini, depolama hesabı bilgilerinize erişmenize olanak tanıyan ücretsiz ve platformlar arası bir araçtır.

Örnek kodu anlama

Sonraki aşamada, nasıl çalıştığını anlayabilmeniz için örnek kodu inceleyeceğiz.

ContainerURL ve BlobURL nesnelerini oluşturma

İlk olarak, blob depolamaya erişmek ve bunları yönetmek için kullanılan ContainerURL ve BlobURL nesnelerine yönelik başvuruları oluşturun. Bu nesneler, REST API'lerini göndermek için Create, Upload ve Download gibi alt düzey API'ler sunar.

  • Kimlik bilgilerinizi depolamak için Sharedkeycredential yapısını kullanın.

  • Kimlik bilgilerini ve seçenekleri kullanarak bir işlem hattı oluşturun. İşlem hattı yeniden deneme ilkeleri, günlük ve HTTP yanıtı iş yüklerini seri durumdan çıkarma gibi daha birçok öğeyi belirtir.

  • Kapsayıcı (Create) ve bloblar (Upload ve Download) üzerinde işlemleri çalıştırmak için yeni ContainerURL'yi ve yeni BlobURL nesnesini başlatın.

ContainerURL'niz olduğunda, bir bloba işaret eden BlobURL nesnesini başlatabilir ve karşıya yükleme, indirme ve kopyalama gibi işlemler yapabilirsiniz.

Önemli

Kapsayıcı adlarının küçük harfle yazılması gerekir. Kapsayıcılar ve blob adları hakkında daha fazla bilgi için bkz. Kapsayıcıları, Blobları ve Meta Verileri Adlandırma ve Bunlara Başvurma.

Bu bölümde, yeni bir kapsayıcı oluşturursunuz. Bu, quickstartblobs-[random string] adlı kapsayıcıdır.

// 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)

Blobları kapsayıcıya yükleme

Blob depolama blok blobları, ekleme bloblarını ve sayfa bloblarını destekler. Blok blobları en sık kullanılan bloblardır ve bu hızlı başlangıçta bu bloblar kullanılmıştır.

Bloba dosya yüklemek için, os.Open kullanarak dosyayı açın. Ardından, dosyayı belirtilen yola yüklemek için REST API'lerden birini kullanabilirsiniz: Upload (PutBlob), StageBlock/CommitBlockList (PutBlock/PutBlockList).

Alternatif olarak, SDK alt düzey REST API'lerinin üstüne yapılandırılmış üst düzey API'ler sağlar. Örnek vermek gerekirse, UploadFileToBlockBlob işlevi, aktarım hızını iyileştirmek için StageBlock (PutBlock) işlemlerini kullanarak bir dosyayı öbekler halinde eşzamanlı olarak karşıya yükler. Dosya 256 MB'den küçükse, aktarımı tek işlemde tamamlamak için onun yerine Upload (PutBlob) kullanır.

Aşağıdaki örnek, dosyayı quickstartblobs-[randomstring] adlı kapsayıcınıza yükler.

// 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)

Kapsayıcıdaki blobları listeleme

ContainerURL üzerinde ListBlobs yöntemini kullanarak kapsayıcıdaki dosyaların listesini alın. ListBlobs, belirtilen Marker'dan başlayarak tek bir blob segmenti (en çok 5000 blob) döndürür. Sabit listenin en baştan başlatılması için boş bir Marker kullanın. Blob adları, sözlük sıralamasına göre döndürülür. Segmenti aldıktan sonra işleyin ve ardından daha önce döndürülen Marker'ı geçirerek ListBlobs yöntemini yeniden çağırın.

// 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")
    }
}

Blobu indirme

BlobURL'de alt düzey Download işlevini kullanarak blobları indirin. Bu bir DownloadResponse struct’ı döndürür. Verileri okumak üzere bir RetryReader akışı almak için struct’ta Body işlevi çalıştırın. Okurken bir bağlantı başarısız olursa, bir bağlantıyı yeniden kurmak ve okumaya devam etmek için ek istekler yapılır. MaxRetryRequests’i 0 (varsayılan) olarak ayarlanmış bir RetryReaderOption belirtildiğinde orijinal yanıt gövdesi döndürülür ve hiçbir yeniden deneme gerçekleştirilmez. Alternatif olarak kodunuzu basitleştirmek için yüksek düzeyli API’ler olarak DownloadBlobToBuffer veya DownloadBlobToFile’ı kullanın.

Aşağıdaki kod, Download işlevini kullanarak blobu indirir. Blobun içeriği arabelleğe yazılır ve konsolda gösterilir.

// 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)

Kaynakları temizleme

Bu hızlı başlangıçta karşıya yüklenen bloblara artık ihtiyacınız kalmadığında, Delete yöntemini kullanarak kapsayıcının tamamını silebilirsiniz.

// 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)

Bloblarla Go uygulamaları geliştirme kaynakları

Blob depolama ile Go geliştirmeye yönelik şu ek kaynaklara bakın:

Sonraki adımlar

Bu hızlı başlangıçta, dosyaları Go kullanarak yerel bir disk ile Azure blob depolama arasında aktarmayı öğrendiniz. Azure Depolama Blobu SDK'sı hakkında daha fazla bilgi için, Kaynak Kodu ve API Başvurusu konularına bakın.