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

Object Storage Service:オブジェクトのアップロード (Go SDK V1)

最終更新日:Nov 29, 2025

このトピックでは、バージョン管理が有効なバケットにオブジェクトをアップロードする方法について説明します。

注意事項

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

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

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

  • ファイルをアップロードするには、oss:PutObject 権限が必要です。詳細については、「RAM ユーザーへのカスタムアクセスポリシーの付与」をご参照ください。

サンプルコード

シンプルアップロード

バージョン管理が有効になっているバケットでは、OSS は新しいオブジェクトごとに一意のバージョン ID を自動的に生成します。この ID は、レスポンスヘッダーの x-oss-version-id フィールドで返されます。バージョン管理が一時停止されているバケットでは、新しいオブジェクトのバージョン ID は "null" になります。同じ名前のオブジェクトをアップロードすると、新しいオブジェクトが前のオブジェクトを上書きします。OSS は、オブジェクトの 1 つのバージョンのみが "null" のバージョン ID を持つことを保証します。

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

package main

import (
	"log"
	"net/http"
	"strings"

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

	// bucketName をバケットの名前に設定します。
	bucketName := "yourBucketName"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
	}

	var retHeader http.Header
	// 文字列をアップロードします。oss.GetResponseHeader を使用してレスポンスヘッダーを取得します。
	// objectName をオブジェクトの完全なパスに設定します。バケット名は含めないでください。
	objectName := "yourObjectName"
	objectValue := "yourObjectValue"
	err = bucket.PutObject(objectName, strings.NewReader(objectValue), oss.GetResponseHeader(&retHeader))
	if err != nil {
		log.Fatalf("Failed to put object '%s': %v", objectName, err)
	}

	// x-oss-version-id を出力します。
	versionId := oss.GetVersionId(retHeader)
	log.Printf("x-oss-version-id: %s", versionId)
}

追加アップロード

バージョン管理が有効なバケットでは、AppendObject 操作は、追加可能オブジェクトの現在のバージョンに対してのみ実行でき、履歴バージョンに対しては実行できません。

説明
  • 追加可能オブジェクトの現在のバージョンで AppendObject 操作を呼び出しても、OSS はそのオブジェクトの以前のバージョンを作成しません。

  • 追加可能オブジェクトの現在のバージョンで PutObject または DeleteObject 操作を呼び出すと、OSS は追加可能オブジェクトを以前のバージョンとして保存します。このオブジェクトにデータを追加することはできなくなります。

  • 標準オブジェクトや削除マーカーなどの追加不可能なオブジェクトの現在のバージョンで AppendObject 操作を呼び出すことはできません。

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

package main

import (
	"log"
	"net/http"
	"strings"

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

	// bucketName をバケットの名前に設定します。
	bucketName := "yourBucketName"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
	}

	// 最初の追加操作の位置は 0 です。戻り値は、次の追加操作の位置を示します。後続の追加操作の位置は、追加操作前のファイルの長さです。
	// objectName をオブジェクトの完全なパスに設定します。バケット名は含めないでください。
	objectName := "yourObjectName"
	var retHeader http.Header
	var nextPos int64 = 0

	// 最初の追加操作を実行します。
	nextPos, err = bucket.AppendObject(objectName, strings.NewReader("YourObjectAppendValue1"), nextPos, oss.GetResponseHeader(&retHeader))
	if err != nil {
		log.Fatalf("Failed to append object '%s': %v", objectName, err)
	}
	log.Printf("x-oss-version-id: %s", retHeader.Get("x-oss-version-id"))

	// 2 番目の追加操作を実行します。
	nextPos, err = bucket.AppendObject(objectName, strings.NewReader("YourObjectAppendValue2"), nextPos, oss.GetResponseHeader(&retHeader))
	if err != nil {
		log.Fatalf("Failed to append object '%s': %v", objectName, err)
	}
	log.Printf("x-oss-version-id: %s", oss.GetVersionId(retHeader))

	// 複数の追加操作を実行できます。
}

マルチパートアップロード

バージョン管理が有効なバケット内のオブジェクトに対して CompleteMultipartUpload 操作を呼び出すと、OSS はそのオブジェクトの一意のバージョン ID を生成します。このバージョン ID は、x-oss-version-id レスポンスヘッダーで返されます。

次のコードは、マルチパートアップロードを実行する方法を示しています。

package main

import (
	"fmt"
	"net/http"
	"os"

	"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 {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 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 {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// バケット名を設定します。
	bucketName := "examplebucket"
	// オブジェクトの完全なパスを設定します。完全なパスにバケット名を含めないでください。
	objectName := "exampleobject.txt"
	// ローカルファイルの完全なパスを設定します。ローカルパスを指定しない場合、ファイルはプロジェクトのローカルパスからアップロードされます。
	locaFilename := "D:\\localpath\\examplefile.txt"
	// oss.GetResponseHeader を使用してレスポンスヘッダーを取得します。
	var retHeader http.Header

	bucket, err := client.Bucket(bucketName)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	chunks, err := oss.SplitFileByPartNum(locaFilename, 3)
	fd, err := os.Open(locaFilename)
	defer fd.Close()
	// ステップ 1: マルチパートアップロードタスクを開始します。
	imur, err := bucket.InitiateMultipartUpload(objectName)
	// ステップ 2: パートをアップロードします。
	var parts []oss.UploadPart
	for _, chunk := range chunks {
		fd.Seek(chunk.Offset, os.SEEK_SET)
		// UploadPart メソッドを呼び出して各パートをアップロードします。
		part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number)
		if err != nil {
			fmt.Println("Error:", err)
			os.Exit(-1)
		}
		parts = append(parts, part)
	}
	// ステップ 3: マルチパートアップロードを完了します。
	cmur, err := bucket.CompleteMultipartUpload(imur, parts, oss.GetResponseHeader(&retHeader))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Println("cmur:", cmur)
	// x-oss-version-id を出力します。
	fmt.Println("x-oss-version-id:", oss.GetVersionId(retHeader))
}

関連ドキュメント

  • シンプルアップロード操作の詳細については、「PutObject」をご参照ください。

  • 追加アップロード操作の詳細については、「AppendObject」をご参照ください。

  • マルチパートアップロードを完了するための API 操作の詳細については、「CompleteMultipartUpload」をご参照ください。