Documentation
      ¶
    
    
  
    
  
    Overview ¶
Example ¶
This example is a quick-starter and demonstrates how to get started using the Azure Blob Storage SDK for Go.
package main
import (
	"context"
	"fmt"
	"io"
	"log"
	"os"
	"strings"
	"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	// Your account name and key can be obtained from the Azure Portal.
	accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
	if !ok {
		panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
	}
	accountKey, ok := os.LookupEnv("AZURE_STORAGE_PRIMARY_ACCOUNT_KEY")
	if !ok {
		panic("AZURE_STORAGE_PRIMARY_ACCOUNT_KEY could not be found")
	}
	cred, err := azblob.NewSharedKeyCredential(accountName, accountKey)
	handleError(err)
	// The service URL for blob endpoints is usually in the form: http(s)://<account>.blob.core.windows.net/
	client, err := azblob.NewClientWithSharedKeyCredential(fmt.Sprintf("https://%s.blob.core.windows.net/", accountName), cred, nil)
	handleError(err)
	// ===== 1. Create a container =====
	containerName := "testcontainer"
	containerCreateResp, err := client.CreateContainer(context.TODO(), containerName, nil)
	handleError(err)
	fmt.Println(containerCreateResp)
	// ===== 2. Upload and Download a block blob =====
	blobData := "Hello world!"
	blobName := "HelloWorld.txt"
	uploadResp, err := client.UploadStream(context.TODO(),
		containerName,
		blobName,
		strings.NewReader(blobData),
		&azblob.UploadStreamOptions{
			Metadata: map[string]*string{"Foo": to.Ptr("Bar")},
			Tags:     map[string]string{"Year": "2022"},
		})
	handleError(err)
	fmt.Println(uploadResp)
	// Download the blob's contents and ensure that the download worked properly
	blobDownloadResponse, err := client.DownloadStream(context.TODO(), containerName, blobName, nil)
	handleError(err)
	// Use the bytes.Buffer object to read the downloaded data.
	// RetryReaderOptions has a lot of in-depth tuning abilities, but for the sake of simplicity, we'll omit those here.
	reader := blobDownloadResponse.Body
	downloadData, err := io.ReadAll(reader)
	handleError(err)
	if string(downloadData) != blobData {
		log.Fatal("Uploaded data should be same as downloaded data")
	}
	err = reader.Close()
	if err != nil {
		return
	}
	// ===== 3. List blobs =====
	// List methods returns a pager object which can be used to iterate over the results of a paging operation.
	// To iterate over a page use the NextPage(context.Context) to fetch the next page of results.
	// PageResponse() can be used to iterate over the results of the specific page.
	pager := client.NewListBlobsFlatPager(containerName, nil)
	for pager.More() {
		resp, err := pager.NextPage(context.TODO())
		handleError(err)
		for _, v := range resp.Segment.BlobItems {
			fmt.Println(*v.Name)
		}
	}
	// Delete the blob.
	_, err = client.DeleteBlob(context.TODO(), containerName, blobName, nil)
	handleError(err)
	// Delete the container.
	_, err = client.DeleteContainer(context.TODO(), containerName, nil)
	handleError(err)
}
Example (Blob_AccessConditions) ¶
This example shows how to perform operations on blob conditionally.
package main
import (
	"context"
	"fmt"
	"log"
	"os"
	"strings"
	"time"
	"github.com/Azure/azure-sdk-for-go/sdk/azcore"
	"github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming"
	"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	accountName, accountKey := os.Getenv("AZURE_STORAGE_ACCOUNT_NAME"), os.Getenv("AZURE_STORAGE_ACCOUNT_KEY")
	credential, err := azblob.NewSharedKeyCredential(accountName, accountKey)
	handleError(err)
	blockBlob, err := blockblob.NewClientWithSharedKeyCredential(fmt.Sprintf("https://%s.blob.core.windows.net/mycontainer/Data.txt", accountName), credential, nil)
	handleError(err)
	// This function displays the results of an operation
	showResult := func(response *blob.DownloadStreamResponse, err error) {
		if err != nil {
			log.Fatalf("Failure: %s\n", err.Error())
		} else {
			err := response.Body.Close()
			if err != nil {
				log.Fatal(err)
			}
			// The client must close the response body when finished with it
			fmt.Printf("Success: %v\n", response)
		}
		// Close the response
		if err != nil {
			return
		}
		fmt.Printf("Success: %v\n", response)
	}
	showResultUpload := func(response blockblob.UploadResponse, err error) {
		if err != nil {
			log.Fatalf("Failure: %s\n", err.Error())
		}
		fmt.Printf("Success: %v\n", response)
	}
	// Create the blob
	upload, err := blockBlob.Upload(context.TODO(), streaming.NopCloser(strings.NewReader("Text-1")), nil)
	showResultUpload(upload, err)
	// Download blob content if the blob has been modified since we uploaded it (fails):
	downloadResp, err := blockBlob.DownloadStream(
		context.TODO(),
		&azblob.DownloadStreamOptions{
			AccessConditions: &blob.AccessConditions{
				ModifiedAccessConditions: &blob.ModifiedAccessConditions{
					IfModifiedSince: upload.LastModified,
				},
			},
		},
	)
	showResult(&downloadResp, err)
	// Download blob content if the blob hasn't been modified in the last 24 hours (fails):
	downloadResp, err = blockBlob.DownloadStream(
		context.TODO(),
		&azblob.DownloadStreamOptions{
			AccessConditions: &blob.AccessConditions{
				ModifiedAccessConditions: &blob.ModifiedAccessConditions{
					IfUnmodifiedSince: to.Ptr(time.Now().UTC().Add(time.Hour * -24))},
			},
		},
	)
	showResult(&downloadResp, err)
	// Upload new content if the blob hasn't changed since the version identified by ETag (succeeds):
	showResultUpload(blockBlob.Upload(
		context.TODO(),
		streaming.NopCloser(strings.NewReader("Text-2")),
		&blockblob.UploadOptions{
			AccessConditions: &blob.AccessConditions{
				ModifiedAccessConditions: &blob.ModifiedAccessConditions{IfMatch: upload.ETag},
			},
		},
	))
	// Download content if it has changed since the version identified by ETag (fails):
	downloadResp, err = blockBlob.DownloadStream(
		context.TODO(),
		&azblob.DownloadStreamOptions{
			AccessConditions: &blob.AccessConditions{
				ModifiedAccessConditions: &blob.ModifiedAccessConditions{IfNoneMatch: upload.ETag}},
		})
	showResult(&downloadResp, err)
	// Upload content if the blob doesn't already exist (fails):
	showResultUpload(blockBlob.Upload(
		context.TODO(),
		streaming.NopCloser(strings.NewReader("Text-3")),
		&blockblob.UploadOptions{
			AccessConditions: &blob.AccessConditions{
				ModifiedAccessConditions: &blob.ModifiedAccessConditions{IfNoneMatch: to.Ptr(azcore.ETagAny)},
			},
		}))
}
Example (Blob_Client_Download) ¶
This example shows how to download a large stream with intelligent retries. Specifically, if the connection fails while reading, continuing to read from this stream initiates a new GetBlob call passing a range that starts from the last byte successfully read before the failure.
package main
import (
	"context"
	"fmt"
	"io"
	"log"
	"os"
	"github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	// From the Azure portal, get your Storage account blob service URL endpoint.
	accountName, accountKey := os.Getenv("AZURE_STORAGE_ACCOUNT_NAME"), os.Getenv("AZURE_STORAGE_ACCOUNT_KEY")
	// Create a blobClient object to a blob in the container (we assume the container & blob already exist).
	blobURL := fmt.Sprintf("https://%s.blob.core.windows.net/mycontainer/BigBlob.bin", accountName)
	credential, err := azblob.NewSharedKeyCredential(accountName, accountKey)
	handleError(err)
	blobClient, err := blob.NewClientWithSharedKeyCredential(blobURL, credential, nil)
	handleError(err)
	contentLength := int64(0) // Used for progress reporting to report the total number of bytes being downloaded.
	// Download returns an intelligent retryable stream around a blob; it returns an io.ReadCloser.
	dr, err := blobClient.DownloadStream(context.TODO(), nil)
	handleError(err)
	rs := dr.Body
	// NewResponseBodyProgress wraps the GetRetryStream with progress reporting; it returns an io.ReadCloser.
	stream := streaming.NewResponseProgress(
		rs,
		func(bytesTransferred int64) {
			fmt.Printf("Downloaded %d of %d bytes.\n", bytesTransferred, contentLength)
		},
	)
	defer func(stream io.ReadCloser) {
		err := stream.Close()
		if err != nil {
			log.Fatal(err)
		}
	}(stream) // The client must close the response body when finished with it
	file, err := os.Create("BigFile.bin") // Create the file to hold the downloaded blob contents.
	handleError(err)
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
		}
	}(file)
	written, err := io.Copy(file, stream) // Write to the file by reading from the blob (with intelligent retries).
	handleError(err)
	fmt.Printf("Wrote %d bytes.\n", written)
}
Example (Client_CreateContainer) ¶
package main
import (
	"context"
	"fmt"
	"log"
	"os"
	"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
	if !ok {
		panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
	}
	serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName)
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	handleError(err)
	client, err := azblob.NewClient(serviceURL, cred, nil)
	handleError(err)
	resp, err := client.CreateContainer(context.TODO(), "testcontainer", &azblob.CreateContainerOptions{
		Metadata: map[string]*string{"hello": to.Ptr("world")},
	})
	handleError(err)
	fmt.Println(resp)
}
Example (Client_DeleteBlob) ¶
package main
import (
	"context"
	"fmt"
	"log"
	"os"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
	if !ok {
		panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
	}
	serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName)
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	handleError(err)
	client, err := azblob.NewClient(serviceURL, cred, nil)
	handleError(err)
	resp, err := client.DeleteBlob(context.TODO(), "testcontainer", "testblob", nil)
	handleError(err)
	fmt.Println(resp)
}
Example (Client_DeleteContainer) ¶
package main
import (
	"context"
	"fmt"
	"log"
	"os"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
	if !ok {
		panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
	}
	serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName)
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	handleError(err)
	client, err := azblob.NewClient(serviceURL, cred, nil)
	handleError(err)
	resp, err := client.DeleteContainer(context.TODO(), "testcontainer", nil)
	handleError(err)
	fmt.Println(resp)
}
Example (Client_DownloadFile) ¶
package main
import (
	"context"
	"fmt"
	"log"
	"os"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	// Set up file to download the blob to
	destFileName := "test_download_file.txt"
	destFile, err := os.Create(destFileName)
	handleError(err)
	defer func(destFile *os.File) {
		err = destFile.Close()
		handleError(err)
	}(destFile)
	accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
	if !ok {
		panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
	}
	serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName)
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	handleError(err)
	client, err := azblob.NewClient(serviceURL, cred, nil)
	handleError(err)
	// Perform download
	_, err = client.DownloadFile(context.TODO(), "testcontainer", "virtual/dir/path/"+destFileName, destFile,
		&azblob.DownloadFileOptions{
			// If Progress is non-nil, this function is called periodically as bytes are uploaded.
			Progress: func(bytesTransferred int64) {
				fmt.Println(bytesTransferred)
			},
		})
	// Assert download was successful
	handleError(err)
}
Example (Client_DownloadStream) ¶
accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
if !ok {
	panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
}
serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName)
cred, err := azidentity.NewDefaultAzureCredential(nil)
handleError(err)
client, err := azblob.NewClient(serviceURL, cred, nil)
handleError(err)
// Download the blob
downloadResponse, err := client.DownloadStream(ctx, "testcontainer", "test_download_stream.bin", nil)
handleError(err)
// Assert that the content is correct
actualBlobData, err := io.ReadAll(downloadResponse.Body)
handleError(err)
fmt.Println(len(actualBlobData))
Example (Client_NewClient) ¶
package main
import (
	"fmt"
	"log"
	"os"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	// this example uses Azure Active Directory (AAD) to authenticate with Azure Blob Storage
	accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
	if !ok {
		panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
	}
	serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName)
	// https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#DefaultAzureCredential
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	handleError(err)
	client, err := azblob.NewClient(serviceURL, cred, nil)
	handleError(err)
	fmt.Println(client.URL())
}
Example (Client_NewClientFromConnectionString) ¶
package main
import (
	"fmt"
	"log"
	"os"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	// this example uses a connection string to authenticate with Azure Blob Storage
	connectionString, ok := os.LookupEnv("AZURE_STORAGE_CONNECTION_STRING")
	if !ok {
		log.Fatal("the environment variable 'AZURE_STORAGE_CONNECTION_STRING' could not be found")
	}
	serviceClient, err := azblob.NewClientFromConnectionString(connectionString, nil)
	handleError(err)
	fmt.Println(serviceClient.URL())
}
Example (Client_NewListBlobsPager) ¶
accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
if !ok {
	panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
}
serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName)
cred, err := azidentity.NewDefaultAzureCredential(nil)
handleError(err)
client, err := azblob.NewClient(serviceURL, cred, nil)
handleError(err)
pager := client.NewListBlobsFlatPager("testcontainer", &azblob.ListBlobsFlatOptions{
	Include: container.ListBlobsInclude{Deleted: true, Versions: true},
})
for pager.More() {
	resp, err := pager.NextPage(ctx)
	handleError(err) // if err is not nil, break the loop.
	for _, _blob := range resp.Segment.BlobItems {
		fmt.Printf("%v", _blob.Name)
	}
}
Example (Client_NewListContainersPager) ¶
accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
if !ok {
	panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
}
serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName)
cred, err := azidentity.NewDefaultAzureCredential(nil)
handleError(err)
client, err := azblob.NewClient(serviceURL, cred, nil)
handleError(err)
pager := client.NewListContainersPager(&azblob.ListContainersOptions{
	Include: azblob.ListContainersInclude{Metadata: true, Deleted: true},
})
for pager.More() {
	resp, err := pager.NextPage(ctx)
	handleError(err) // if err is not nil, break the loop.
	for _, _container := range resp.ContainerItems {
		fmt.Printf("%v", _container)
	}
}
Example (Client_UploadFile) ¶
package main
import (
	"context"
	"fmt"
	"log"
	"os"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	// Set up file to upload
	fileSize := 8 * 1024 * 1024
	fileName := "test_upload_file.txt"
	fileData := make([]byte, fileSize)
	err := os.WriteFile(fileName, fileData, 0666)
	handleError(err)
	// Open the file to upload
	fileHandler, err := os.Open(fileName)
	handleError(err)
	// close the file after it is no longer required.
	defer func(file *os.File) {
		err = file.Close()
		handleError(err)
	}(fileHandler)
	// delete the local file if required.
	defer func(name string) {
		err = os.Remove(name)
		handleError(err)
	}(fileName)
	accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
	if !ok {
		panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
	}
	serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName)
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	handleError(err)
	client, err := azblob.NewClient(serviceURL, cred, nil)
	handleError(err)
	// Upload the file to a block blob
	_, err = client.UploadFile(context.TODO(), "testcontainer", "virtual/dir/path/"+fileName, fileHandler,
		&azblob.UploadFileOptions{
			BlockSize:   int64(1024),
			Concurrency: uint16(3),
			// If Progress is non-nil, this function is called periodically as bytes are uploaded.
			Progress: func(bytesTransferred int64) {
				fmt.Println(bytesTransferred)
			},
		})
	handleError(err)
}
Example (Client_UploadStream) ¶
package main
import (
	"bytes"
	"context"
	"fmt"
	"log"
	"os"
	"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	accountName, ok := os.LookupEnv("AZURE_STORAGE_ACCOUNT_NAME")
	if !ok {
		panic("AZURE_STORAGE_ACCOUNT_NAME could not be found")
	}
	serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net/", accountName)
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	handleError(err)
	client, err := azblob.NewClient(serviceURL, cred, nil)
	handleError(err)
	// Set up test blob
	containerName := "testcontainer"
	bufferSize := 8 * 1024 * 1024
	blobName := "test_upload_stream.bin"
	blobData := make([]byte, bufferSize)
	blobContentReader := bytes.NewReader(blobData)
	// Perform UploadStream
	resp, err := client.UploadStream(context.TODO(), containerName, blobName, blobContentReader,
		&azblob.UploadStreamOptions{
			Metadata: map[string]*string{"hello": to.Ptr("world")},
		})
	// Assert that upload was successful
	handleError(err)
	fmt.Println(resp)
}
Example (Client_anonymous_NewClientWithNoCredential) ¶
package main
import (
	"fmt"
	"log"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	// this example uses anonymous access to access a public blob
	serviceClient, err := azblob.NewClientWithNoCredential("https://azurestoragesamples.blob.core.windows.net/samples/cloud.jpg", nil)
	handleError(err)
	fmt.Println(serviceClient.URL())
}
Example (ProgressUploadDownload) ¶
package main
import (
	"bytes"
	"context"
	"fmt"
	"log"
	"os"
	"strings"
	"github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming"
	"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container"
)
func handleError(err error) {
	if err != nil {
		log.Fatal(err.Error())
	}
}
func main() {
	// Create a credentials object with your Azure Storage Account name and key.
	accountName, accountKey := os.Getenv("AZURE_STORAGE_ACCOUNT_NAME"), os.Getenv("AZURE_STORAGE_ACCOUNT_KEY")
	credential, err := azblob.NewSharedKeyCredential(accountName, accountKey)
	handleError(err)
	// From the Azure portal, get your Storage account blob service URL endpoint.
	containerURL := fmt.Sprintf("https://%s.blob.core.windows.net/mycontainer", accountName)
	// Create an serviceClient object that wraps the service URL and a request pipeline to making requests.
	containerClient, err := container.NewClientWithSharedKeyCredential(containerURL, credential, nil)
	handleError(err)
	// Here's how to create a blob with HTTP headers and metadata (I'm using the same metadata that was put on the container):
	blobClient := containerClient.NewBlockBlobClient("Data.bin")
	// requestBody is the stream of data to write
	requestBody := streaming.NopCloser(strings.NewReader("Some text to write"))
	// Wrap the request body in a RequestBodyProgress and pass a callback function for progress reporting.
	requestProgress := streaming.NewRequestProgress(streaming.NopCloser(requestBody), func(bytesTransferred int64) {
		fmt.Printf("Wrote %d of %d bytes.", bytesTransferred, requestBody)
	})
	_, err = blobClient.Upload(context.TODO(), requestProgress, &blockblob.UploadOptions{
		HTTPHeaders: &blob.HTTPHeaders{
			BlobContentType:        to.Ptr("text/html; charset=utf-8"),
			BlobContentDisposition: to.Ptr("attachment"),
		},
	})
	handleError(err)
	// Here's how to read the blob's data with progress reporting:
	get, err := blobClient.DownloadStream(context.TODO(), nil)
	handleError(err)
	// Wrap the response body in a ResponseBodyProgress and pass a callback function for progress reporting.
	responseBody := streaming.NewResponseProgress(
		get.Body,
		func(bytesTransferred int64) {
			fmt.Printf("Read %d of %d bytes.", bytesTransferred, *get.ContentLength)
		},
	)
	downloadedData := &bytes.Buffer{}
	_, err = downloadedData.ReadFrom(responseBody)
	if err != nil {
		return
	}
	err = responseBody.Close()
	if err != nil {
		return
	}
	fmt.Printf("Downloaded data: %s\n", downloadedData.String())
}
Index ¶
- Constants
 - type AccessConditions
 - type CPKInfo
 - type CPKScopeInfo
 - type Client
 - func NewClient(serviceURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error)
 - func NewClientFromConnectionString(connectionString string, options *ClientOptions) (*Client, error)
 - func NewClientWithNoCredential(serviceURL string, options *ClientOptions) (*Client, error)
 - func NewClientWithSharedKeyCredential(serviceURL string, cred *SharedKeyCredential, options *ClientOptions) (*Client, error)
 
- func (c *Client) CreateContainer(ctx context.Context, containerName string, o *CreateContainerOptions) (CreateContainerResponse, error)
 - func (c *Client) DeleteBlob(ctx context.Context, containerName string, blobName string, ...) (DeleteBlobResponse, error)
 - func (c *Client) DeleteContainer(ctx context.Context, containerName string, o *DeleteContainerOptions) (DeleteContainerResponse, error)
 - func (c *Client) DownloadBuffer(ctx context.Context, containerName string, blobName string, buffer []byte, ...) (int64, error)
 - func (c *Client) DownloadFile(ctx context.Context, containerName string, blobName string, file *os.File, ...) (int64, error)
 - func (c *Client) DownloadStream(ctx context.Context, containerName string, blobName string, ...) (DownloadStreamResponse, error)
 - func (c *Client) NewListBlobsFlatPager(containerName string, o *ListBlobsFlatOptions) *runtime.Pager[ListBlobsFlatResponse]
 - func (c *Client) NewListContainersPager(o *ListContainersOptions) *runtime.Pager[ListContainersResponse]
 - func (c *Client) ServiceClient() *service.Client
 - func (c *Client) URL() string
 - func (c *Client) UploadBuffer(ctx context.Context, containerName string, blobName string, buffer []byte, ...) (UploadBufferResponse, error)
 - func (c *Client) UploadFile(ctx context.Context, containerName string, blobName string, file *os.File, ...) (UploadFileResponse, error)
 - func (c *Client) UploadStream(ctx context.Context, containerName string, blobName string, body io.Reader, ...) (UploadStreamResponse, error)
 
- type ClientOptions
 - type CreateContainerOptions
 - type CreateContainerResponse
 - type DeleteBlobOptions
 - type DeleteBlobResponse
 - type DeleteContainerOptions
 - type DeleteContainerResponse
 - type DeleteSnapshotsOptionType
 - type DownloadBufferOptions
 - type DownloadFileOptions
 - type DownloadStreamOptions
 - type DownloadStreamResponse
 - type HTTPRange
 - type ListBlobsFlatOptions
 - type ListBlobsFlatResponse
 - type ListBlobsFlatSegmentResponse
 - type ListBlobsInclude
 - type ListContainersInclude
 - type ListContainersOptions
 - type ListContainersResponse
 - type ListContainersSegmentResponse
 - type ObjectReplicationPolicy
 - type PublicAccessType
 - type RetryReaderOptions
 - type SharedKeyCredential
 - type URLParts
 - type UploadBufferOptions
 - type UploadBufferResponse
 - type UploadFileOptions
 - type UploadFileResponse
 - type UploadResponse
 - type UploadStreamOptions
 - type UploadStreamResponse
 
Examples ¶
- Package
 - Package (Blob_AccessConditions)
 - Package (Blob_Client_Download)
 - Package (Client_CreateContainer)
 - Package (Client_DeleteBlob)
 - Package (Client_DeleteContainer)
 - Package (Client_DownloadFile)
 - Package (Client_DownloadStream)
 - Package (Client_NewClient)
 - Package (Client_NewClientFromConnectionString)
 - Package (Client_NewClientWithSharedKeyCredential)
 - Package (Client_NewListBlobsPager)
 - Package (Client_NewListContainersPager)
 - Package (Client_UploadFile)
 - Package (Client_UploadStream)
 - Package (Client_anonymous_NewClientWithNoCredential)
 - Package (ProgressUploadDownload)
 
Constants ¶
const ( // EventUpload is used for logging events related to upload operation. EventUpload = exported.EventUpload // EventSubmitBatch is used for logging events related to submit blob batch operation. EventSubmitBatch = exported.EventSubmitBatch )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AccessConditions ¶ added in v0.5.0
type AccessConditions = exported.BlobAccessConditions
AccessConditions identifies blob-specific access conditions which you optionally set.
type CPKInfo ¶ added in v1.0.0
CPKInfo contains a group of parameters for client provided encryption key.
type CPKScopeInfo ¶ added in v1.0.0
type CPKScopeInfo = container.CPKScopeInfo
CPKScopeInfo contains a group of parameters for the ContainerClient.Create method.
type Client ¶ added in v0.5.0
type Client struct {
	// contains filtered or unexported fields
}
    Client represents a URL to an Azure Storage blob; the blob may be a block blob, append blob, or page blob.
func NewClient ¶ added in v0.5.0
func NewClient(serviceURL string, cred azcore.TokenCredential, options *ClientOptions) (*Client, error)
NewClient creates an instance of Client with the specified values.
- serviceURL - the URL of the storage account e.g. https://<account>.blob.core.windows.net/
 - cred - an Azure AD credential, typically obtained via the azidentity module
 - options - client options; pass nil to accept the default values
 
func NewClientFromConnectionString ¶ added in v0.5.0
func NewClientFromConnectionString(connectionString string, options *ClientOptions) (*Client, error)
NewClientFromConnectionString creates an instance of Client with the specified values.
- connectionString - a connection string for the desired storage account
 - options - client options; pass nil to accept the default values
 
func NewClientWithNoCredential ¶ added in v0.5.0
func NewClientWithNoCredential(serviceURL string, options *ClientOptions) (*Client, error)
NewClientWithNoCredential creates an instance of Client with the specified values. This is used to anonymously access a storage account or with a shared access signature (SAS) token.
- serviceURL - the URL of the storage account e.g. https://<account>.blob.core.windows.net/?<sas token>
 - options - client options; pass nil to accept the default values
 
func NewClientWithSharedKeyCredential ¶ added in v0.5.0
func NewClientWithSharedKeyCredential(serviceURL string, cred *SharedKeyCredential, options *ClientOptions) (*Client, error)
NewClientWithSharedKeyCredential creates an instance of Client with the specified values.
- serviceURL - the URL of the storage account e.g. https://<account>.blob.core.windows.net/
 - cred - a SharedKeyCredential created with the matching storage account and access key
 - options - client options; pass nil to accept the default values
 
func (*Client) CreateContainer ¶ added in v0.5.0
func (c *Client) CreateContainer(ctx context.Context, containerName string, o *CreateContainerOptions) (CreateContainerResponse, error)
CreateContainer is a lifecycle method to creates a new container under the specified account. If the container with the same name already exists, a ContainerAlreadyExists Error will be raised. This method returns a client with which to interact with the newly created container.
func (*Client) DeleteBlob ¶ added in v0.5.0
func (c *Client) DeleteBlob(ctx context.Context, containerName string, blobName string, o *DeleteBlobOptions) (DeleteBlobResponse, error)
DeleteBlob marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection. Note that deleting a blob also deletes all its snapshots. For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob.
func (*Client) DeleteContainer ¶ added in v0.5.0
func (c *Client) DeleteContainer(ctx context.Context, containerName string, o *DeleteContainerOptions) (DeleteContainerResponse, error)
DeleteContainer is a lifecycle method that marks the specified container for deletion. The container and any blobs contained within it are later deleted during garbage collection. If the container is not found, a ResourceNotFoundError will be raised.
func (*Client) DownloadBuffer ¶ added in v0.5.0
func (c *Client) DownloadBuffer(ctx context.Context, containerName string, blobName string, buffer []byte, o *DownloadBufferOptions) (int64, error)
DownloadBuffer downloads an Azure blob to a buffer with parallel.
func (*Client) DownloadFile ¶ added in v0.5.0
func (c *Client) DownloadFile(ctx context.Context, containerName string, blobName string, file *os.File, o *DownloadFileOptions) (int64, error)
DownloadFile downloads an Azure blob to a local file. The file would be truncated if the size doesn't match.
func (*Client) DownloadStream ¶ added in v0.5.0
func (c *Client) DownloadStream(ctx context.Context, containerName string, blobName string, o *DownloadStreamOptions) (DownloadStreamResponse, error)
DownloadStream reads a range of bytes from a blob. The response also includes the blob's properties and metadata. For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob.
func (*Client) NewListBlobsFlatPager ¶ added in v0.5.0
func (c *Client) NewListBlobsFlatPager(containerName string, o *ListBlobsFlatOptions) *runtime.Pager[ListBlobsFlatResponse]
NewListBlobsFlatPager returns a pager for blobs starting from the specified Marker. Use an empty Marker to start enumeration from the beginning. Blob names are returned in lexicographic order. For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs.
func (*Client) NewListContainersPager ¶ added in v0.5.0
func (c *Client) NewListContainersPager(o *ListContainersOptions) *runtime.Pager[ListContainersResponse]
NewListContainersPager operation returns a pager of the containers under the specified account. Use an empty Marker to start enumeration from the beginning. Container names are returned in lexicographic order. For more information, see https://docs.microsoft.com/rest/api/storageservices/list-containers2.
func (*Client) ServiceClient ¶ added in v0.6.0
ServiceClient returns the embedded service client for this client.
func (*Client) UploadBuffer ¶ added in v0.5.0
func (c *Client) UploadBuffer(ctx context.Context, containerName string, blobName string, buffer []byte, o *UploadBufferOptions) (UploadBufferResponse, error)
UploadBuffer uploads a buffer in blocks to a block blob.
func (*Client) UploadFile ¶ added in v0.5.0
func (c *Client) UploadFile(ctx context.Context, containerName string, blobName string, file *os.File, o *UploadFileOptions) (UploadFileResponse, error)
UploadFile uploads a file in blocks to a block blob.
func (*Client) UploadStream ¶ added in v0.5.0
func (c *Client) UploadStream(ctx context.Context, containerName string, blobName string, body io.Reader, o *UploadStreamOptions) (UploadStreamResponse, error)
UploadStream copies the file held in io.Reader to the Blob at blockBlobClient. A Context deadline or cancellation will cause this to error.
type ClientOptions ¶
type ClientOptions base.ClientOptions
ClientOptions contains the optional parameters when creating a Client.
type CreateContainerOptions ¶
type CreateContainerOptions = service.CreateContainerOptions
CreateContainerOptions contains the optional parameters for the ContainerClient.Create method.
type CreateContainerResponse ¶ added in v0.5.0
type CreateContainerResponse = service.CreateContainerResponse
CreateContainerResponse contains the response from method container.Client.Create.
type DeleteBlobOptions ¶
type DeleteBlobOptions = blob.DeleteOptions
DeleteBlobOptions contains the optional parameters for the Client.Delete method.
type DeleteBlobResponse ¶ added in v0.5.0
type DeleteBlobResponse = blob.DeleteResponse
DeleteBlobResponse contains the response from method blob.Client.Delete.
type DeleteContainerOptions ¶
type DeleteContainerOptions = service.DeleteContainerOptions
DeleteContainerOptions contains the optional parameters for the container.Client.Delete method.
type DeleteContainerResponse ¶ added in v0.5.0
type DeleteContainerResponse = service.DeleteContainerResponse
DeleteContainerResponse contains the response from method container.Client.Delete
type DeleteSnapshotsOptionType ¶
type DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionType
DeleteSnapshotsOptionType defines values for DeleteSnapshotsOptionType.
const ( DeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionTypeInclude DeleteSnapshotsOptionTypeOnly DeleteSnapshotsOptionType = generated.DeleteSnapshotsOptionTypeOnly )
func PossibleDeleteSnapshotsOptionTypeValues ¶
func PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType
PossibleDeleteSnapshotsOptionTypeValues returns the possible values for the DeleteSnapshotsOptionType const type.
type DownloadBufferOptions ¶ added in v0.5.0
type DownloadBufferOptions = blob.DownloadBufferOptions
DownloadBufferOptions identifies options used by the DownloadBuffer and DownloadFile functions.
type DownloadFileOptions ¶ added in v0.5.0
type DownloadFileOptions = blob.DownloadFileOptions
DownloadFileOptions identifies options used by the DownloadBuffer and DownloadFile functions.
type DownloadStreamOptions ¶ added in v0.5.0
type DownloadStreamOptions = blob.DownloadStreamOptions
DownloadStreamOptions contains the optional parameters for the Client.DownloadStream method.
type DownloadStreamResponse ¶ added in v0.5.0
type DownloadStreamResponse = blob.DownloadStreamResponse
DownloadStreamResponse wraps AutoRest generated BlobDownloadResponse and helps to provide info for retry.
type HTTPRange ¶ added in v0.5.0
HTTPRange defines a range of bytes within an HTTP resource, starting at offset and ending at offset+count. A zero-value HTTPRange indicates the entire resource. An HTTPRange which has an offset and zero value count indicates from the offset to the resource's end.
type ListBlobsFlatOptions ¶ added in v0.5.0
type ListBlobsFlatOptions = container.ListBlobsFlatOptions
ListBlobsFlatOptions contains the optional parameters for the container.Client.ListBlobFlatSegment method.
type ListBlobsFlatResponse ¶ added in v0.5.0
type ListBlobsFlatResponse = container.ListBlobsFlatResponse
ListBlobsFlatResponse contains the response from method container.Client.ListBlobFlatSegment.
type ListBlobsFlatSegmentResponse ¶
type ListBlobsFlatSegmentResponse = generated.ListBlobsFlatSegmentResponse
ListBlobsFlatSegmentResponse - An enumeration of blobs
type ListBlobsInclude ¶ added in v0.5.0
type ListBlobsInclude = container.ListBlobsInclude
ListBlobsInclude indicates what additional information the service should return with each blob.
type ListContainersInclude ¶ added in v0.5.0
type ListContainersInclude = service.ListContainersInclude
ListContainersInclude indicates what additional information the service should return with each container.
type ListContainersOptions ¶
type ListContainersOptions = service.ListContainersOptions
ListContainersOptions contains the optional parameters for the container.Client.ListContainers operation
type ListContainersResponse ¶ added in v0.5.0
type ListContainersResponse = service.ListContainersResponse
ListContainersResponse contains the response from method service.Client.ListContainersSegment.
type ListContainersSegmentResponse ¶
type ListContainersSegmentResponse = generated.ListContainersSegmentResponse
ListContainersSegmentResponse - An enumeration of containers
type ObjectReplicationPolicy ¶
type ObjectReplicationPolicy = blob.ObjectReplicationPolicy
ObjectReplicationPolicy are deserialized attributes
type PublicAccessType ¶
type PublicAccessType = generated.PublicAccessType
PublicAccessType defines values for AccessType - private (default) or blob or container.
const ( PublicAccessTypeBlob PublicAccessType = generated.PublicAccessTypeBlob PublicAccessTypeContainer PublicAccessType = generated.PublicAccessTypeContainer )
func PossiblePublicAccessTypeValues ¶
func PossiblePublicAccessTypeValues() []PublicAccessType
PossiblePublicAccessTypeValues returns the possible values for the PublicAccessType const type.
type RetryReaderOptions ¶
type RetryReaderOptions = blob.RetryReaderOptions
RetryReaderOptions contains properties which can help to decide when to do retry.
type SharedKeyCredential ¶
type SharedKeyCredential = exported.SharedKeyCredential
SharedKeyCredential contains an account's name and its primary or secondary key.
func NewSharedKeyCredential ¶
func NewSharedKeyCredential(accountName, accountKey string) (*SharedKeyCredential, error)
NewSharedKeyCredential creates an immutable SharedKeyCredential containing the storage account's name and either its primary or secondary key.
type URLParts ¶ added in v0.5.0
URLParts object represents the components that make up an Azure Storage Container/Blob URL. NOTE: Changing any SAS-related field requires computing a new SAS signature.
type UploadBufferOptions ¶ added in v0.5.0
type UploadBufferOptions = blockblob.UploadBufferOptions
UploadBufferOptions provides set of configurations for UploadBuffer operation
type UploadBufferResponse ¶ added in v0.5.0
type UploadBufferResponse = blockblob.UploadBufferResponse
UploadBufferResponse contains the response from method Client.UploadBuffer/Client.UploadFile.
type UploadFileOptions ¶ added in v0.5.0
type UploadFileOptions = blockblob.UploadFileOptions
UploadFileOptions provides set of configurations for UploadFile operation
type UploadFileResponse ¶ added in v0.5.0
type UploadFileResponse = blockblob.UploadFileResponse
UploadFileResponse contains the response from method Client.UploadBuffer/Client.UploadFile.
type UploadResponse ¶ added in v0.5.0
type UploadResponse = blockblob.CommitBlockListResponse
UploadResponse contains the response from method blockblob.Client.CommitBlockList.
type UploadStreamOptions ¶ added in v0.4.0
type UploadStreamOptions = blockblob.UploadStreamOptions
UploadStreamOptions provides set of configurations for UploadStream operation
type UploadStreamResponse ¶ added in v0.5.0
type UploadStreamResponse = blockblob.CommitBlockListResponse
UploadStreamResponse contains the response from method Client.CommitBlockList.