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

Object Storage Service:OSS SDK for Goを使用したマルチパートアップロードの実行

最終更新日:Dec 09, 2024

Object Storage Service (OSS) は、マルチパートアップロード機能を提供します。 マルチパートアップロードを使用すると、大きなオブジェクトを複数のパートに分割してアップロードできます。 これらのパーツがアップロードされたら、CompleteMultipartUpload操作を呼び出して、パーツを完全なオブジェクトに結合できます。

使用上の注意

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

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

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

  • マルチパートアップロードを実行するには、oss:PutObject権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。

  • OSS SDK for Go 2.2.5以降は、次のサンプルコードに含まれるすべての属性をサポートしています。

処理中

マルチパートアップロードを使用してローカルファイルをアップロードするには、次の手順を実行します。

  1. マルチパートアップロードタスクを開始します。

    Bucket.InitiateMultipartUploadメソッドを呼び出して、OSSで一意のアップロードIDを取得します。

  2. パーツをアップロード

    Bucket.UploadPartメソッドを呼び出して、パーツをアップロードします。

    説明
    • 特定のアップロードIDを使用してマルチパートアップロードタスクを実行してアップロードされるパーツの場合、パーツ番号はオブジェクト内の相対位置を識別します。 部品をアップロードし、その部品番号を再利用して別の部品をアップロードすると、新しい部品が元の部品を上書きします。

    • OSSは、レスポンスのETagヘッダーにアップロードされた各パーツのMD5ハッシュを含めます。

    • OSSはアップロードされたパーツのMD5ハッシュを計算し、そのMD5ハッシュをOSS SDK for Goによって計算されたMD5ハッシュと比較します。 2つのハッシュが異なる場合、OSSはInvalidDigestエラーコードを返します。

  3. マルチパートアップロードタスクを完了します。

    すべてのパーツをアップロードしたら、Bucket.CompleteMultipartUploadメソッドを呼び出して、パーツを完全なオブジェクトに結合します。

次のサンプルコードは、マルチパートアップロードプロセスに従ってマルチパートアップロードタスクを実行する方法の例を示しています。

package main

import (
	"fmt"
	"log"
	"os"

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

func main() {
	// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Create an OSSClient instance. 
	// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint. 
	// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Specify the version of the signature algorithm.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Specify the name of the bucket.
	bucketName := "examplebucket"
	// Specify the full path of the object. Do not include the bucket name in the full path. 
	objectName := "exampleobject.txt"
	// Specify the full path of the local file. By default, if you do not specify the path of the local file, the file is uploaded from the path of the project to which the sample program belongs. 
	localFilename := "/localpath/exampleobject.txt"

	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

        // Specify the part size. Unit: bytes. In this example, the part size is set to 5 MB. 
	partSize := int64(5 * 1024 * 1024)

	// Call the multipart upload function. 
	if err := uploadMultipart(bucket, objectName, localFilename, partSize); err != nil {
		log.Fatalf("Failed to upload multipart: %v", err)
	}

}

// Specify the multipart upload function.
func uploadMultipart(bucket *oss.Bucket, objectName, localFilename string, partSize int64) error {
	// Split the local file.
	chunks, err := oss.SplitFileByPartSize(localFilename, partSize)
	if err != nil {
		return fmt.Errorf("failed to split file into chunks: %w", err)
	}

	// Open the local file. 
	file, err := os.Open(localFilename)
	if err != nil {
		return fmt.Errorf("failed to open file: %w", err)
	}
	defer file.Close()

	// Step 1: Initiate a multipart upload task. 
	imur, err := bucket.InitiateMultipartUpload(objectName)
	if err != nil {
		return fmt.Errorf("failed to initiate multipart upload: %w", err)
	}

	// Step 2: Upload the parts. 
	var parts []oss.UploadPart
	for _, chunk := range chunks {
		part, err := bucket.UploadPart(imur, file, chunk.Size, chunk.Number)
		if err != nil {
			// If a part fails to be uploaded, cancel the multipart upload task. 
			if abortErr := bucket.AbortMultipartUpload(imur); abortErr != nil {
				log.Printf("Failed to abort multipart upload: %v", abortErr)
			}
			return fmt.Errorf("failed to upload part: %w", err)
		}
		parts = append(parts, part)
	}

	// Set the access control list (ACL) of the object to private. By default, the object inherits the ACL of the bucket. 
	objectAcl := oss.ObjectACL(oss.ACLPrivate)

	// Step 3: Complete the multipart upload task. 
	_, err = bucket.CompleteMultipartUpload(imur, parts, objectAcl)
	if err != nil {
		// If you fail to complete the multipart upload task, cancel the multipart upload task. 
		if abortErr := bucket.AbortMultipartUpload(imur); abortErr != nil {
			log.Printf("Failed to abort multipart upload: %v", abortErr)
		}
		return fmt.Errorf("failed to complete multipart upload: %w", err)
	}

	log.Printf("Multipart upload completed successfully.")
	return nil
}

よくある質問

マルチパートアップロードタスクをキャンセルするにはどうすればよいですか?

次のいずれかのシナリオでは、Bucket.AbortMultipartUploadメソッドを使用して、マルチパートアップロードタスクをキャンセルできます。

  1. オブジェクトのエラー

    • アップロードプロセス中にオブジェクトの損傷や悪意のあるコードなどのエラーを検出した場合は、マルチパートアップロードタスクをキャンセルして、潜在的なリスクを防ぐことができます。

  2. 不安定なネットワーク接続

    • ネットワーク接続が不安定または中断されている場合、アップロードプロセス中に部品が紛失または破損する可能性があります。 マルチパートアップロードタスクをキャンセルし、別のマルチパートアップロードタスクを開始して、データの整合性と一貫性を確保できます。

  3. リソース制限

    • ストレージ容量が不足し、アップロードするオブジェクトが大きすぎる場合は、マルチパートアップロードタスクをキャンセルし、ストレージリソースを解放し、リソースをより重要なタスクに割り当てることができます。

  4. 偶発的な操作

    • 誤って不要なマルチパートアップロードタスクを開始したり、オブジェクトの誤ったバージョンをアップロードしたりした場合は、マルチパートアップロードタスクをキャンセルできます。

...
if err = bucket.AbortMultipartUpload(imur); err != nil {
log.Fatalf("failed to abort multipart upload: %w", err)
}

log.Printf("Multipart upload aborted successfully.")

アップロードされたパーツをリストする方法?

次のいずれかのシナリオでは、Bucket.ListUploadedPartsメソッドを使用して、マルチパートアップロードタスクでアップロードされたパーツを一覧表示できます。

オブジェクトのアップロードの進行状況の監視

  1. 大きなオブジェクトのアップロード

    • 非常に大きなオブジェクトをアップロードするときは、アップロードされたパーツをリストして、アップロードタスクが期待どおりに実行され、問題が最も早い機会に検出されるようにします。

  2. 再開可能なアップロード

    • オブジェクトのアップロード中にネットワーク接続が不安定または中断された場合、アップロードされたパーツを表示して、再開可能なアップロードを使用して失敗したパーツを再アップロードする必要があるかどうかを判断できます。

  3. トラブルシューティング

    • オブジェクトのアップロード中にエラーが発生した場合は、特定のパーツのアップロード失敗など、アップロードされたパーツをチェックすることでエラーをすばやく特定し、それに応じてエラーを解決できます。

  4. リソース管理

    • リソース使用量を厳密に制御する必要があるシナリオでは、オブジェクトのアップロードの進行状況を監視することで、ストレージ容量と帯域幅のリソースをより適切に管理し、リソースが効果的に使用されるようにすることができます。

...	
if lsRes, err := bucket.ListUploadedParts(imur); err != nil {
log.Fatalf("Failed to list uploaded parts: %v", err)
}

for _, upload := range lsRes.UploadedParts {
log.Printf("List PartNumber: %d, ETag: %s, LastModified: %v\n", upload.PartNumber, upload.ETag, upload.LastModified)
}

バケットのマルチパートアップロードタスクを一覧表示するにはどうすればよいですか?

次のいずれかのシナリオでは、Bucket.ListMultipartUploadsメソッドを使用して、バケットの進行中のすべてのマルチパートアップロードタスクを一覧表示できます。

監視シナリオ

  1. 一括オブジェクトのアップロード管理

    • 多数のオブジェクトをアップロードする場合は、ListMultipartUploadsメソッドを使用してすべてのマルチパートアップロードタスクをリアルタイムで監視し、すべてのオブジェクトが正しくアップロードされていることを確認できます。

  2. 障害の検出と回復

    • アップロードプロセス中にネットワークの問題やその他の障害が発生した場合、特定の部品のアップロードに失敗する可能性があります。 進行中のマルチパートアップロードタスクを監視することで、これらの問題をできるだけ早く検出し、アップロードを再開するための対策を講じることができます。

  3. リソースの最適化と管理

    • 大規模なオブジェクトのアップロード中に、進行中のマルチパートアップロードタスクを監視して、帯域幅使用量の調整やアップロードの進行状況に基づいたアップロードポリシーの最適化など、リソース割り当てを最適化できます。

  4. データ移行

    • 大規模なデータ移行を実行する場合、進行中のすべてのマルチパートアップロードタスクを監視して、データのスムーズな移行を確実にし、可能性のある問題をできるだけ早い機会に検出して解決できます。

パラメーター設定

パラメーター

説明

Delimiter

オブジェクトを名前でグループ化するために使用される文字。 プレフィックスから次の区切り文字までの同じ文字列を名前に含むオブジェクトは、CommonPrefixesパラメーターで単一の結果要素としてグループ化されます。

MaxUploads

今回返すマルチパートアップロードタスクの最大数。 デフォルト値は 1000 です。 最大値は 1000 です。

KeyMarker

名前がKeyMarkerパラメーターの値のアルファベット順の後にあるオブジェクトを含むすべてのマルチパートアップロードタスクをリストに含めるように指定します。 このパラメーターをUploadIDMarkerパラメーターと共に使用して、返された結果を一覧表示する開始位置を指定できます。

接頭辞

返されるオブジェクト名に含める必要があるプレフィックス。 クエリにプレフィックスを使用する場合、返されるオブジェクト名にはプレフィックスが含まれます。

UploadIDMarker

返された結果を一覧表示する開始位置。 このパラメーターは、KeyMarkerパラメーターと共に使用されます。

  • KeyMarkerパラメーターが設定されていない場合、このパラメーターは無視されます。

  • KeyMarkerパラメーターが設定されている場合、応答には次の項目が含まれます。

    • オブジェクト名がKeyMarkerパラメーターの値の後にアルファベット順であるマルチパートアップロードタスク。

    • オブジェクト名がKeyMarkerパラメーターの値と同じで、アップロードIDがUploadIDMarkerパラメーターの値より大きいマルチパートアップロードタスク。

  • パラメーターのデフォルト値を使用してマルチパートアップロードタスクを一覧表示する

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.KeyMarker(keyMarker), oss.UploadIDMarker(uploadIdMarker))
    if err != nil {
    log.Fatalf("failed to list multipart uploads: %w", err)
    }
    
    for _, upload := range lsRes.Uploads {
    log.Printf("Upload: %s, UploadID: %s\n", upload.Key, upload.UploadID)
    }
  • Prefixパラメーターをファイルに設定し、マルチパートアップロードタスクを一覧表示する

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.Prefix('file'))
    if err != nil {
    log.Fatalf("failed to list multipart uploads with prefix: %w", err)
    }
    
    log.Printf("Uploads:", lsRes.Uploads)
  • 最大100のマルチパートアップロードタスクが返されることを指定します

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.MaxUploads(100))
    if err != nil {
    log.Fatalf("failed to list multipart uploads with limit: %w", err)
    }
    
    log.Printf("Uploads:", lsRes.Uploads)
  • Prefixパラメーターをfileに設定し、最大100のマルチパートアップロードタスクが返されるように指定します

    ...
    lsRes, err := bucket.ListMultipartUploads(oss.Prefix("file"), oss.MaxUploads(100))
    if err != nil {
    log.Fatalf("failed to list multipart uploads with prefix and limit: %w", err)
    }
    
    log.Printf("Uploads:", lsRes.Uploads)

関連ドキュメント

  • マルチパートアップロードの実行に使用する完全なサンプルコードについては、『GitHub』をご参照ください。

  • マルチパートアップロードには3つのAPI操作が含まれます。 操作の詳細については、以下のトピックを参照してください。

  • マルチパートアップロードタスクをキャンセルするために呼び出すことができるAPI操作の詳細については、「AbortMultipartUpload」をご参照ください。

  • アップロードされたパーツを一覧表示するために呼び出すことができるAPI操作の詳細については、「ListUploadedParts」をご参照ください。

  • 実行中のすべてのマルチパートアップロードタスクを一覧表示するために呼び出すことができるAPI操作の詳細については、「ListMultipartUploads」をご参照ください。 進行中のマルチパートアップロードタスクには、開始されたが完了またはキャンセルされていないタスクが含まれます。