Tous les produits
Search
Centre de documentation

Object Storage Service:Append upload (Go SDK V1)

Dernière mise à jour :Sep 22, 2026

Appelez l'opération AppendObject pour ajouter du contenu à des objets existants de type « appendable ».

Notes

  • Cette rubrique utilise le point de terminaison public de la région Chine (Hangzhou). Pour accéder à OSS depuis d'autres services Alibaba Cloud situés dans la même région, utilisez un point de terminaison interne. Pour plus d'informations sur les régions et les points de terminaison OSS, consultez Régions et points de terminaison.

  • Les identifiants d'accès sont obtenus à partir des variables d'environnement. Pour savoir comment configurer les identifiants d'accès, consultez Configurer les identifiants d'accès.

  • Cette rubrique explique comment créer une instance OSSClient avec un point de terminaison OSS. Pour d'autres configurations, telles que l'utilisation d'un domaine personnalisé ou l'authentification via des identifiants du Security Token Service (STS), consultez Configurer un client (Go SDK V1).

  • Si l'objet auquel vous souhaitez ajouter du contenu n'existe pas, l'opération AppendObject crée un objet de type « appendable ».

  • Si l'objet auquel vous souhaitez ajouter du contenu existe :

    • Si l'objet est de type « appendable » et que la position spécifiée pour le début de l'ajout correspond à la taille actuelle de l'objet, les données sont ajoutées à la fin de l'objet.

    • Si l'objet est de type « appendable » mais que la position spécifiée pour le début de l'ajout ne correspond pas à la taille actuelle de l'objet, l'erreur PositionNotEqualToLength est renvoyée.

    • Si l'objet n'est pas de type « appendable », l'erreur ObjectNotAppendable est renvoyée.

Permissions

Par défaut, un compte Alibaba Cloud dispose de toutes les autorisations. Les utilisateurs RAM ou les rôles RAM associés à un compte Alibaba Cloud ne disposent d'aucune autorisation par défaut. Le compte Alibaba Cloud ou l'administrateur du compte doit accorder les autorisations d'opération via des politiques RAM ou une Bucket Policy.

API

Action

Description

AppendObject

oss:PutObject

Appelez cette opération pour télécharger un objet en l'ajoutant à un objet existant.

oss:PutObjectTagging

Lors du téléchargement d'un objet par ajout à un objet existant, si vous spécifiez des tags d'objet via x-oss-tagging, cette autorisation est requise.

Exemple de code

Le code suivant montre comment effectuer un téléchargement par ajout :

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

FAQ

Comment utiliser la méthode AppendObject s'il ne s'agit pas du premier téléchargement par ajout ?

Dans les scénarios suivants, appelez la méthode GetObjectDetailedMeta pour récupérer les métadonnées de l'objet. Cela garantit que les données sont ajoutées à la position correcte. Les métadonnées contiennent la position de fin du dernier téléchargement par ajout.

  1. Collecte des journaux d'application :

    • Les applications génèrent de grandes quantités de données de journal lors de leur exécution. Le téléchargement par ajout permet d'ajouter continuellement des données de journal au même objet au lieu de créer un nouvel objet à chaque fois.

  2. Analyse de données en temps réel :

    • Les systèmes d'analyse de données en temps réel envoient souvent des flux de données continus vers un système de stockage. Le téléchargement par ajout permet d'ajouter ces flux de données au même objet en temps réel. Cela simplifie le traitement par lots ou en temps réel ultérieur.

...
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.")

Références

  • Pour l'exemple de code complet relatif aux téléchargements par ajout, consultez l'exemple GitHub.

  • Pour plus d'informations sur l'opération API AppendObject, consultez AppendObject.