Поделиться через


Загрузка блочного BLOB-объекта с помощью Go

В этой статье показано, как загрузить объект Blob с помощью модуля клиента хранилища Azure для Go. Данные можно загрузить в блок-блоб из пути к файлу, потока, двоичного объекта или текстовой строки. Вы также можете загружать блобы с индексными тегами.

Предварительные условия

Настройка среды

Если у вас нет существующего проекта, в этом разделе показано, как настроить проект для работы с клиентским модулем Хранилище BLOB-объектов Azure для Go. Ниже приведены действия по установке модуля, добавлению import путей и созданию авторизованного клиентского объекта. Дополнительные сведения см. в статье Начало работы с хранилищем BLOB-объектов Azure и Go.

Установка модулей

Установите модуль azblob с помощью следующей команды:

go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob

Чтобы выполнить проверку подлинности с помощью идентификатора Microsoft Entra (рекомендуется), установите azidentity модуль с помощью следующей команды:

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

Добавление путей импорта

В файле кода добавьте следующие пути импорта:

import (
    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

Эти пути импорта представляют собой минимально необходимые для начала работы. В некоторых примерах кода в этой статье могут потребоваться дополнительные пути импорта. Дополнительные сведения и примеры использования см. в примерах кода.

Создание клиентского объекта

Чтобы подключить приложение к хранилищу BLOB-объектов, создайте клиентский объект с помощью azblob. NewClient. В следующем примере показано, как создать клиентский объект с помощью DefaultAzureCredential авторизации:

func getServiceClientTokenCredential(accountURL string) *azblob.Client {
    // Create a new service client with token credential
    credential, err := azidentity.NewDefaultAzureCredential(nil)
    handleError(err)

    client, err := azblob.NewClient(accountURL, credential, nil)
    handleError(err)

    return client
}

Авторизация

Механизм авторизации должен иметь необходимые разрешения для загрузки блоба. Для авторизации с использованием Microsoft Entra ID (рекомендуется), требуется роль Участник данных BLOB-объектов хранилища или выше. Дополнительные сведения см. в руководстве по авторизации для Put BLOB (REST API) и Put Block (REST API).

Отправка данных в блочный BLOB-объект

Чтобы загрузить объект типа BLOB, вызовите любой из следующих методов из клиентского объекта.

Чтобы выполнить загрузку, клиентская библиотека может использовать либо Put Blob, либо ряд вызовов Put Block, за которыми следует Put Block List. Это поведение зависит от общего размера объекта и способа установки параметров передачи данных.

Примечание.

Клиентские библиотеки службы хранилища Azure не поддерживают одновременную запись в один блоб. Если приложению требуется несколько процессов записи в один и тот же блоб, следует реализовать стратегию управления параллелизмом, чтобы обеспечить предсказуемое взаимодействие. Дополнительные сведения о стратегиях параллелизма см. в статье Управление параллелизмом в хранилище BLOB-объектов.

Отправка блочного BLOB-объекта из локального пути к файлу

Следующий пример отправляет локальный файл в блочный двоичный объект.

func uploadBlobFile(client *azblob.Client, containerName string, blobName string) {
    // Open the file for reading
    file, err := os.OpenFile("path/to/sample/file", os.O_RDONLY, 0)
    handleError(err)

    defer file.Close()

    // Upload the file to the specified container with the specified blob name
    _, err = client.UploadFile(context.TODO(), containerName, blobName, file, nil)
    handleError(err)
}

Загрузить блочный BLOB-объект из потока

В следующем примере создается экземпляр Reader и строка обрабатывается как поток байтов. Далее поток загружается в блочный бинарный объект.

func uploadBlobStream(client *azblob.Client, containerName string, blobName string) {
    data := "Hello, world!"
    blobContentReader := strings.NewReader(data)

    // Upload the file to the specified container with the specified blob name
    _, err := client.UploadStream(context.TODO(), containerName, blobName, blobContentReader, nil)
    handleError(err)
}

Отправка двоичных данных в блочный BLOB-объект

В следующем примере загружаются двоичные данные в блочный двоичный объект:

func uploadBlobBuffer(client *azblob.Client, containerName string, blobName string) {
    // Create a buffer with the content of the file to upload
    data := []byte("Hello, world!")

    // Upload the data to a block blob
    _, err := client.UploadBuffer(context.TODO(), containerName, blobName, data, nil)
    handleError(err)
}

Загрузка блоб-объекта с индексными метками

В следующем примере загружается блочный объект BLOB с тегами индекса:

func uploadBlobWithIndexTags(client *azblob.Client, containerName string, blobName string) {
    // Create a buffer with the content of the file to upload
    data := []byte("Hello, world!")

    // Upload the data to a block blob with index tags
    _, err := client.UploadBuffer(context.TODO(), containerName, blobName, data, &azblob.UploadBufferOptions{
        Tags: map[string]string{
            "key1": "value1",
            "key2": "value2",
        },
    })
    handleError(err)
}

Отправка блочного BLOB-объекта с параметрами конфигурации

При загрузке блоба можно определить настройки конфигурации клиентской библиотеки. Эти параметры можно настроить для повышения производительности, повышения надежности и оптимизации затрат. В следующих примерах кода показано, как определить параметры конфигурации для операции отправки.

Указание параметров передачи данных для отправки

Параметры конфигурации можно задать при загрузке BLOB с целью оптимизации производительности. Для операций отправки доступны следующие параметры конфигурации:

  • BlockSize: размер каждого блока при загрузке блочного блоба. Значение по умолчанию — 4 МБ.
  • Concurrency: максимальное количество параллельных подключений, используемых во время отправки. Значение по умолчанию равно 5.

Эти параметры конфигурации доступны при отправке с помощью следующих методов:

Метод Upload не поддерживает эти параметры и передает данные в одном запросе.

Дополнительные сведения об ограничениях размера передачи для хранилища BLOB-объектов см. в разделе "Целевые объекты масштабирования" для хранилища BLOB-объектов.

В следующем примере кода показано, как указать параметры передачи данных с помощью UploadFileOptions. Значения, указанные в этом примере, не предназначены для рекомендации. Чтобы правильно настроить эти значения, необходимо учитывать конкретные потребности приложения.

func uploadBlobWithTransferOptions(client *azblob.Client, containerName string, blobName string) {
    // Open the file for reading
    file, err := os.OpenFile("path/to/sample/file", os.O_RDONLY, 0)
    handleError(err)

    defer file.Close()

    // Upload the data to a block blob with transfer options
    _, err = client.UploadFile(context.TODO(), containerName, blobName, file,
        &azblob.UploadFileOptions{
            BlockSize:   int64(4 * 1024 * 1024), // 4 MiB
            Concurrency: uint16(2),
        })
    handleError(err)
}

Дополнительные сведения о настройке параметров передачи данных см. в разделе "Настройка производительности" для отправки и скачивания с помощью Go.

Примечание.

Примеры кода в этом руководстве предназначены, чтобы помочь вам начать работу с хранилищем BLOB-объектов Azure и языком программирования Go. Необходимо изменить обработку ошибок и Context значения в соответствии с потребностями приложения.

Ресурсы

Дополнительные сведения о загрузке BLOB-объектов с помощью клиентского модуля Azure Blob Storage для Go см. в следующих ресурсах.

Примеры кода

  • Просмотр примеров кода из этой статьи (GitHub)

Операции REST API

Пакет SDK Azure для Go содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API через знакомые парадигмы Go. Методы клиентской библиотеки для отправки больших двоичных объектов используют следующие операции REST API:

Ресурсы модуля клиента

См. также

  • Эта статья является частью руководства разработчика по хранилищу Blob для Go. Дополнительные сведения см. в полном списке статей руководства разработчика по созданию приложения Go.