Object Storage Service (OSS) は、マルチパートアップロード機能を提供します。 マルチパートアップロードを使用すると、大きなオブジェクトを複数のパートに分割してアップロードできます。 これらのパーツがアップロードされたら、CompleteMultipartUpload操作を呼び出して、パーツを完全なオブジェクトに結合できます。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。
マルチパートアップロードを実行するには、
oss:PutObject
権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。
処理中
マルチパートアップロードを使用してオブジェクトをアップロードするには、次の手順を実行します。
マルチパートアップロードタスクを開始します。
Bucket.InitiateMultipartUploadメソッドを呼び出して、OSSで一意のアップロードIDを取得します。
パーツをアップロード
Bucket.UploadPartメソッドを呼び出して、パーツをアップロードします。
説明特定のアップロードIDを持つマルチパートアップロードタスクによってアップロードされたパーツの場合、パーツ番号はオブジェクト内の相対位置を識別します。 部品をアップロードし、その部品番号を再利用して別の部品をアップロードすると、新しい部品が元の部品を上書きします。
OSSは、レスポンスのETagヘッダーにアップロードされた各パーツのMD5ハッシュを含めます。
OSSはアップロードされたパーツのMD5ハッシュを計算し、そのMD5ハッシュをOSS SDK for Goによって計算されたMD5ハッシュと比較します。 2つのハッシュが異なる場合、OSSはInvalidDigestエラーコードを返します。
マルチパートアップロードタスクを完了します。
すべてのパーツをアップロードしたら、Bucket.CompleteMultipartUploadメソッドを呼び出して、パーツを完全なオブジェクトに結合します。
マルチパートアップロードのサンプルコード
次のサンプルコードは、マルチパートアップロードプロセスに従ってマルチパートアップロードタスクを実装する方法の例を示しています。
パッケージメイン
import (import (import)
"fmt"
"os"
"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 {
fmt.Println("Error:", err)
os.Exit(-1)
}
// OSSClientインスタンスを作成します。
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。
client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケットの名前を指定します。
bucketName := "examplebucket"
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。
objectName := "exampleobject.txt"
// アップロードするローカルファイルのフルパスを指定します。 デフォルトでは、ローカルファイルのフルパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
locaFilename := "D :\\ localpath\\examplefile.txt"
bucket, err := client.Bucket(bucketName)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// ローカルファイルを3つの部分に分割します。
chunks, err := oss.SplitFileByPartNum(locaFilename, 3)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fd, err := os.Open(locaFilename)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
defer fd.Close()
// リクエストの有効期間を指定します。
expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
// 次のコードは、マルチパートアップロードタスクを開始するときにリクエストヘッダーを指定する方法の例を示しています。
options := []oss.Option{
oss.MetadataDirective(oss.MetaReplace),
oss.Expires(expires),
// オブジェクトのダウンロード時のwebページのキャッシュ動作を指定します。
// oss.CacheControl("no-cache") 、
// ダウンロードされたときのオブジェクトの名前を指定します。
// oss.ContentDisposition("attachment;filename=FileName.txt") 、
// オブジェクトのコンテンツエンコーディング形式を指定します。
// oss.ContentEncoding("gzip") 、
// レスポンスでオブジェクト名のエンコードに使用されるメソッドを指定します。 URLエンコードのみがサポートされています。
// oss.EncodingType("url") 、
// オブジェクトのストレージクラスを指定します。
// oss.ObjectStorageClass(oss.StorageStandard) 、
}
// ステップ1: マルチパートアップロードタスクを開始します。
imur, err := bucket.InitiateMultipartUpload(objectName, options...)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// ステップ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)
}
// オブジェクトのアクセス制御リスト (ACL) をprivateに設定します。 デフォルトでは、オブジェクトはバケットのACLを継承します。
objectAcl := oss.ObjectACL(oss. ACLDrivate)
// ステップ3: マルチパートアップロードタスクを完了します。
cmur, err := bucket.CompleteMultipartUpload(imur, parts, objectAcl)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("cmur:", cmur)
}
マルチパートアップロードタスクのキャンセル
bucket.AbortMultipartUploadメソッドを呼び出して、マルチパートアップロードタスクをキャンセルできます。 マルチパートアップロードタスクをキャンセルした場合、アップロードIDを使用してパーツを管理することはできません。 アップロードされたパーツは削除されます。
次のサンプルコードは、マルチパートアップロードタスクをキャンセルする方法の例を示しています。
パッケージメイン
import (import (import)
"fmt"
「github.com/aliyun/aliyun-oss-go-sdk/oss」
"os"
)
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インスタンスを作成します。
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。
client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケットの名前を指定します。
bucket, err := client.Bucket("examplebucket")
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// マルチパートアップロードタスクを開始します。
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。
imur, err := bucket.InitiateMultipartUpload("exampleobject.txt")
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// マルチパートアップロードタスクをキャンセルします。
err = bucket.AbortMultipartUpload(imur)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}
アップロードしたパーツの一覧表示
次のコードは、特定のマルチパートアップロードタスクでアップロードされるパーツを一覧表示する方法の例を示しています。
パッケージメイン
import (import (import)
"fmt"
「github.com/aliyun/aliyun-oss-go-sdk/oss」
"os"
)
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インスタンスを作成します。
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。
client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケットの名前を指定します。
bucketName := "examplebucket"
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。
objectName := "exampleobject.txt"
// アップロードするローカルファイルのフルパスを指定します。 デフォルトでは、ローカルファイルのフルパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
locaFilename := "D :\\ localpath\\examplefile.txt"
bucket, err := client.Bucket(bucketName)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// ローカルファイルを3つの部分に分割します。
chunks, err := oss.SplitFileByPartNum(locaFilename, 3)
fd, err := os.Open(locaFilename)
defer fd. 閉じる ()
// マルチパートアップロードタスクを開始します。
imur, err := bucket.InitiateMultipartUpload(objectName)
uploadID := imur.UploadID
fmt.Println("InitiateMultipartUpload Upload ID: ", UploadID)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// パーツをアップロードします。
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)
}
fmt.Println("UploadPartNumber: ", part.PartNumber, ", ETag: ", part.ETag)
parts = append(parts, part)
}
// InitiateMultipartUploadResultメソッドを呼び出して、アップロードされたパーツを一覧表示します。
lsRes, err := bucket.ListUploadedParts(imur)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// アップロードしたパーツを表示します。
fmt.Println("\nParts:", lsRes.UploadedParts)
for _, upload := range lsRes.UploadedParts {
fmt.Println("List PartNumber: ", upload.PartNumber, ", ETag: ", upload.ETag, ", LastModified: ", upload.LastModified)
}
// InitiateMultipartUploadResult操作を使用して取得した結果に基づいて、アップロードされたすべてのパーツをリストします。 結果は、指定されたオブジェクト名とアップロードIDに基づいて生成されます。
var imur_with_uploadid oss.InitiateMultipartUploadResult
imur_with_uploadid.Key = objectName
imur_with_uploadid.UploadID = uploadID
// アップロードしたパーツを一覧表示します。
lsRes, err = bucket.ListUploadedParts(imur_with_uploadid)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// アップロードしたパーツを表示します。
fmt.Println("\nListUploadedParts by UploadID: ", uploadID)
for _, upload := range lsRes.UploadedParts {
fmt.Println("List PartNumber: ", upload.PartNumber, ", ETag: ", upload.ETag, ", LastModified: ", upload.LastModified)
}
// マルチパートアップロードタスクを完了します。
cmur, err := bucket.CompleteMultipartUpload(imur, parts)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("cmur:", cmur)
}
マルチパートアップロードタスクの一覧表示
Bucket.ListMultipartUploads
メソッドを呼び出して、開始されたが完了またはキャンセルされていない進行中のすべてのマルチパートアップロードタスクを一覧表示できます。 次の表に、マルチパートアップロードタスクを一覧表示するために設定できるパラメーターを示します。
パラメーター | 説明 |
Delimiter | オブジェクトを名前でグループ化するために使用される文字。 プレフィックスから次の区切り文字までの同じ文字列を名前に含むオブジェクトは、CommonPrefixesパラメーターで単一の結果要素としてグループ化されます。 |
MaxUploads | 今回返すマルチパートアップロードタスクの最大数。 デフォルト値は 1000 です。 最大値は 1000 です。 |
KeyMarker | 名前がKeyMarkerパラメーターの値のアルファベット順の後にあるオブジェクトを含むすべてのマルチパートアップロードタスクをリストに含めるように指定します。 このパラメーターをUploadIDMarkerパラメーターと共に使用して、返された結果を一覧表示する開始位置を指定できます。 |
接頭辞 | 返されるオブジェクト名に含める必要があるプレフィックス。 クエリにプレフィックスを使用する場合、返されるオブジェクト名にはプレフィックスが含まれます。 |
UploadIDMarker | 返された結果を一覧表示する開始位置。 このパラメーターは、KeyMarkerパラメーターと共に使用されます。
|
パラメーターのデフォルト値を使用してマルチパートアップロードタスクを一覧表示する
パッケージメイン import (import (import) "fmt" 「github.com/aliyun/aliyun-oss-go-sdk/oss」 "os" ) 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インスタンスを作成します。 // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。 client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider)) if err! =nil { fmt.Println("Error:", err) // バケットの名前を指定します。 bucketName := "examplebucket" bucket, err := client.Bucket(bucketName) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } // すべてのマルチパートアップロードタスクを一覧表示します。 keyMarker := "" uploadIdMarker := "" for { // デフォルトでは、一度に最大1,000のレコードを返すことができます。 lsRes, err := bucket.ListMultipartUploads(oss.KeyMarker(keyMarker), oss.UploadIDMarker(uploadIdMarker)) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } // マルチパートアップロードタスクを表示します。 for _, upload := range lsRes.Uploads { fmt.Println("Upload: ", upload.Key, ", UploadID: ", upload.UploadID) } if lsRes.IsTruncated { keyMarker = lsRes.NextKeyMarker uploadIdMarker = lsRes.NextUploadIDMarker } else { 休憩 } } } }
Prefixパラメーターをファイルに設定し、マルチパートアップロードタスクを一覧表示する
lsRes, err := bucket.ListMultipartUploads(oss.Prefix("file")) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Println("Uploads:", lsRes.Uploads)
最大100個のマルチパートアップロードタスクが返されることを指定します
lsRes, err := bucket.ListMultipartUploads(oss.MaxUploads(100)) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Println("Uploads:", lsRes.Uploads)
Prefixパラメーターをfileに設定し、最大100個のマルチパートアップロードタスクが返されるように指定します。
lsRes, err := bucket.ListMultipartUploads(oss.Prefix("file"), oss.MaxUploads(100)) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Println("Uploads:", lsRes.Uploads)
参考資料
マルチパートアップロードの実行に使用する完全なサンプルコードについては、『GitHub』をご参照ください。
マルチパートアップロードには3つのAPI操作が含まれます。 操作の詳細については、以下のトピックを参照してください。
マルチパートアップロードタスクをキャンセルするために呼び出すことができるAPI操作の詳細については、「AbortMultipartUpload」をご参照ください。
アップロードされたパーツを一覧表示するために呼び出すことができるAPI操作の詳細については、「ListParts」をご参照ください。
実行中のすべてのマルチパートアップロードタスクを一覧表示するために呼び出すことができるAPI操作の詳細については、「ListMultipartUploads」をご参照ください。 進行中のマルチパートアップロードタスクは、開始されたが完了またはキャンセルされていないタスクです。