フラットな構造では管理が困難になる可能性がある大量のオブジェクトの整理と管理を簡素化するために、Object Storage Service (OSS) は、フォルダー構造をシミュレートするディレクトリ機能を提供します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「クライアントの設定 (Go SDK V1)」をご参照ください。
サンプルコード
ディレクトリの作成
次のコードは、ディレクトリを作成する方法の例を示しています。
package main
import (
"bytes"
"log"
"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 '%s': %v", bucketName, err)
}
// ディレクトリ名を設定します。名前はスラッシュ (/) で終わる必要があります。
dirName := "exampledir/"
err = bucket.PutObject(dirName, bytes.NewReader([]byte("")))
if err != nil {
log.Fatalf("Failed to create directory '%s': %v", dirName, err)
}
log.Printf("Directory '%s' created successfully", dirName)
}
ディレクトリの削除
ディレクトリを削除すると、そのすべてのサブディレクトリとオブジェクトも削除されます。操作には注意が必要です。
次のコードは、log/ ディレクトリとその中のすべてのファイルを削除する方法の例を示しています。
package main
import (
"log"
"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 := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// 削除するディレクトリの完全なパスを設定します。完全なパスにはバケット名は含まれません。
prefix := oss.Prefix("log/")
marker := oss.Marker("")
count := 0
for {
// 指定されたプレフィックスを持つすべてのオブジェクトを一覧表示します。
lor, err := bucket.ListObjects(marker, prefix)
if err != nil {
log.Fatalf("Failed to list objects in bucket '%s' with prefix '%s': %v", bucketName, prefix, err)
}
objects := []string{}
for _, object := range lor.Objects {
objects = append(objects, object.Key)
}
if len(objects) == 0 {
break
}
// ディレクトリとその中のすべてのファイルを削除します。
// oss.DeleteObjectsQuiet を true に設定します。これは、削除結果が返されないことを意味します。
delRes, err := bucket.DeleteObjects(objects, oss.DeleteObjectsQuiet(true))
if err != nil {
log.Fatalf("Failed to delete objects in bucket '%s': %v", bucketName, err)
}
if len(delRes.DeletedObjects) > 0 {
log.Fatalf("Some objects failed to delete: %v", delRes.DeletedObjects)
}
count += len(objects)
// ページングパラメーターを更新します。
marker = oss.Marker(lor.NextMarker)
if !lor.IsTruncated {
break
}
}
log.Printf("Success, total delete object count: %d", count)
}
ディレクトリの一覧表示
次のコードは、ルートディレクトリ内のすべてのサブディレクトリを一覧表示する方法の例を示しています。
package main
import (
"log"
"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 インスタンスを作成します。
// バケットのエンドポイントを設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、実際のエンドポイントを指定してください。
endpoint := "https://oss-cn-hangzhou.aliyuncs.com" // これを実際のエンドポイントに置き換えてください。
client, err := oss.New(endpoint, "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// バケット名を設定します。
bucketName := "example-bucket" // これを実際のバケット名に置き換えてください。
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket: %v", err)
}
// 初期の継続トークン。
continueToken := ""
// すべてのサブディレクトリを格納するために使用されます。
var subdirectories []string
for {
// すべてのサブディレクトリを一覧表示します。
lsRes, err := bucket.ListObjectsV2(
oss.ContinuationToken(continueToken),
oss.Prefix(""), // プレフィックスを指定しません。これは、一覧表示がルートディレクトリから開始されることを意味します。
oss.Delimiter("/"), // "/" を使用してディレクトリ構造をシミュレートします。
)
if err != nil {
log.Fatalf("Failed to list objects: %v", err)
}
// サブディレクトリ (CommonPrefixes) を出力して収集します。
for _, prefix := range lsRes.CommonPrefixes {
log.Printf("Subdirectory: %s\n", prefix)
subdirectories = append(subdirectories, prefix)
}
// 一覧表示するオブジェクトがさらにある場合は、継続トークンを更新してループを続行します。
if lsRes.IsTruncated {
continueToken = lsRes.NextContinuationToken
} else {
break
}
}
log.Println("All subdirectories have been listed.")
log.Printf("Total subdirectories: %d\n", len(subdirectories))
}
関連ドキュメント
ディレクトリを作成するための API 操作の詳細については、「PutObject」をご参照ください。
ディレクトリとその中のすべてのファイルを削除するための API 操作の詳細については、「DeleteObject」をご参照ください。