Todos os produtos
Search
Central de documentação

Object Storage Service:Append upload (Go SDK V1)

Última atualização: Sep 22, 2026

Chame a operação AppendObject para adicionar conteúdo a objetos appendable existentes.

Observações

  • Neste tópico, utiliza-se o endpoint público da região china (Hangzhou). Para acessar o OSS a partir de outros serviços Alibaba Cloud na mesma região do OSS, use um endpoint interno. Para mais informações sobre regiões e endpoints do OSS, consulte Regions and endpoints.

  • Neste tópico, as credenciais de acesso são obtidas de variáveis de ambiente. Para mais informações sobre como configure credenciais de acesso, consulte Configure access credentials.

  • Este tópico demonstra como crie uma instância OSSClient com um endpoint do oss. Para configurações alternativas, como usar um domínio personalizado ou autenticar com credenciais do Security Token service (STS), consulte Configure a client (Go SDK V1).

  • Se o objeto ao qual você deseja adicionar conteúdo não existir, a operação AppendObject cria um objeto appendable.

  • Se o objeto ao qual você deseja adicionar conteúdo já existir:

    • Caso o objeto seja appendable e a posição especificada para início da operação de append seja igual ao tamanho atual do objeto, os dados são adicionados ao final do objeto.

    • Caso o objeto seja appendable e a posição especificada para início da operação de append não seja igual ao tamanho atual do objeto, o sistema retorna o erro PositionNotEqualToLength.

    • Se o objeto não for appendable, o sistema retorna o erro ObjectNotAppendable.

Permissões

Por padrão, uma conta Alibaba Cloud possui permissões completas. Usuários RAM ou funções RAM vinculados a uma conta Alibaba Cloud não possuem nenhuma permissão por padrão. A conta Alibaba Cloud ou o administrador da conta deve conceder permissões de operação por meio de RAM policies ou Bucket Policy.

API

Action

Descrição

AppendObject

oss:PutObject

Permite fazer upload de um objeto adicionando-o a um objeto existente.

oss:PutObjectTagging

Ao fazer upload de um objeto por meio de append a um objeto existente, essa permissão será necessária se você especifique tags de objeto por meio de x-oss-tagging.

Código de exemplo

O código a seguir mostra como execute um append upload:

package main

import (
	"log"
	"strings"
	"time"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// Create an OSSClient instance.
	// Set yourEndpoint to the Endpoint of the bucket. For example, for the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, use the actual Endpoint.
	// Set yourRegion to the region where the bucket is located. For example, for the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, use the actual region.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Set the signature version.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Failed to create OSS client: %v", err)
	}

	// Specify the bucket name, for example, examplebucket.
	bucketName := "examplebucket" // Replace with the actual bucket name.
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket: %v", err)
	}

	// Specify the full path of the object. Do not include the bucket name. For example, appendobject.txt.
	objectName := "appendobject.txt"
	var nextPos int64 = 0

	// Specify the expiration time.
	expires := time.Date(2025, time.December, 10, 23, 0, 0, 0, time.UTC)
	options := []oss.Option{
		oss.Expires(expires),
	}

	// The position for the first append upload is 0. The return value is the position for the next append upload.
	appendValue1 := "YourObjectAppendValue1"
	nextPos, err = bucket.AppendObject(objectName, strings.NewReader(appendValue1), nextPos, options...)
	if err != nil {
		log.Fatalf("Failed to append first value: %v", err)
	}

	// Perform the second append upload.
	appendValue2 := "YourObjectAppendValue2"
	nextPos, err = bucket.AppendObject(objectName, strings.NewReader(appendValue2), nextPos)
	if err != nil {
		log.Fatalf("Failed to append second value: %v", err)
	}

	log.Println("Append uploads completed successfully.")
}

Perguntas frequentes

Como usar o método AppendObject quando não é o primeiro append upload?

Nos cenários a seguir, chame o método GetObjectDetailedMeta para recuperar os metadados do objeto. Isso garante que os dados sejam adicionados na posição correta. Os metadados contêm a posição final do último append upload.

  1. Coleta de logs de aplicação:

    • Aplicações geram grandes volumes de dados de log em tempo de execução. O append upload permite adicionar dados de log continuamente ao mesmo objeto, em vez de criar um novo objeto a cada vez.

  2. Análise de dados em tempo real:

    • Sistemas de análise de dados em tempo real costumam enviar fluxos contínuos de dados para um sistema de armazenamento. O append upload permite adicionar esses fluxos ao mesmo objeto em tempo real, o que simplifica o processamento subsequente em lote ou em tempo real.

...
props, err := bucket.GetObjectDetailedMeta(objectName)
if err != nil {
	log.Fatalf("Failed to get object detailed meta: %v", err)
}
nextPos, err = strconv.ParseInt(props.Get("X-Oss-Next-Append-Position"), 10, 64)
if err != nil {
	log.Fatalf("Failed to parse next position: %v", err)
}

// Append upload.
appendValue2 := "YourObjectAppendValue2"
nextPos, err = bucket.AppendObject(objectName, strings.NewReader(appendValue2), nextPos)
if err != nil {
	log.Fatalf("Failed to append second value: %v", err)
}

log.Println("Append uploads completed successfully.")

Referências

  • Para obter o código de exemplo completo de append uploads, consulte o exemplo no GitHub.

  • Para mais informações sobre a operação de API AppendObject, consulte AppendObject.