このトピックでは、バージョン管理が有効なバケットにオブジェクトをアップロードする方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。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」をご参照ください。