すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:追加アップロード (Go SDK V1)

最終更新日:Nov 29, 2025

追加アップロードは、AppendObject メソッドを使用して、既存の追加可能オブジェクトにコンテンツを追加します。

注意事項

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。

  • このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「クライアントの設定 (Go SDK V1)」をご参照ください。

  • ファイルが存在しない場合、AppendObject 操作を呼び出すと、追加可能オブジェクトが作成されます。

  • ファイルが存在する場合:

    • ファイルが追加可能オブジェクトであり、指定された追加位置がファイルの現在の長さと一致する場合、コンテンツはファイルの末尾に追加されます。

    • ファイルが追加可能オブジェクトであっても、指定された追加位置がファイルの現在の長さと一致しない場合、PositionNotEqualToLength 例外がスローされます。

    • ファイルが追加可能オブジェクトでない場合 (シンプルアップロードでアップロードされた通常オブジェクトなど)、ObjectNotAppendable 例外がスローされます。

権限

デフォルトでは、Alibaba Cloud アカウントは完全な権限を持っています。Alibaba Cloud アカウント配下の RAM ユーザーまたは RAM ロールは、デフォルトではいかなる権限も持っていません。Alibaba Cloud アカウントまたはアカウント管理者は、RAM ポリシーまたはバケットポリシーを通じて操作権限を付与する必要があります。

API

アクション

定義

AppendObject

oss:PutObject

この操作を呼び出して、既存のオブジェクトに追加することでオブジェクトをアップロードできます。

oss:PutObjectTagging

既存のオブジェクトに追加してオブジェクトをアップロードする際に、x-oss-tagging を通じてオブジェクトタグを指定する場合、この権限が必要です。

サンプルコード

次のコードは、追加アップロードを実行する方法を示しています。

package main

import (
	"log"
	"strings"
	"time"

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

func main() {
	// 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// OSSClient インスタンスを作成します。
	// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを使用してください。
	// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンの場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、実際のリージョンを使用してください。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 署名バージョンを設定します。
	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)
	}

	// バケット名を指定します (例: examplebucket)。
	bucketName := "examplebucket" // 実際のバケット名に置き換えてください。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket: %v", err)
	}

	// オブジェクトの完全なパスを指定します。バケット名は含めないでください (例: appendobject.txt)。
	objectName := "appendobject.txt"
	var nextPos int64 = 0

	// 有効期限を指定します。
	expires := time.Date(2025, time.December, 10, 23, 0, 0, 0, time.UTC)
	options := []oss.Option{
		oss.Expires(expires),
	}

	// 最初の追加アップロードの位置は 0 です。戻り値は、次の追加アップロードの位置です。
	appendValue1 := "YourObjectAppendValue1"
	nextPos, err = bucket.AppendObject(objectName, strings.NewReader(appendValue1), nextPos, options...)
	if err != nil {
		log.Fatalf("Failed to append first value: %v", err)
	}

	// 2 回目の追加アップロードを実行します。
	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.")
}

よくある質問

AppendObject メソッドが最初の追加アップロードでない場合、どのように使用しますか?

次のシナリオでは、GetObjectDetailedMeta メソッドを呼び出してオブジェクトのメタデータを取得できます。これにより、データが正しい位置に追加されることが保証されます。メタデータには、最後の追加アップロードの終了位置が含まれています。

  1. アプリケーションログの収集:

    • アプリケーションは実行時に大量のログデータを生成します。追加アップロードを使用すると、毎回新しいオブジェクトを作成する代わりに、同じオブジェクトに継続的にログデータを追加できます。

  2. リアルタイムデータ分析

    • リアルタイムデータ分析システムは、多くの場合、連続したデータストリームをストレージシステムに送信します。追加アップロードを使用すると、これらのデータストリームをリアルタイムで同じオブジェクトに追加できます。これにより、後続のバッチ処理またはリアルタイム処理が簡素化されます。

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

// 追加アップロード。
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.")

関連ドキュメント

  • 追加アップロードの完全なサンプルコードについては、GitHub の例をご参照ください。

  • AppendObject API 操作の詳細については、「AppendObject」をご参照ください。