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

Object Storage Service:マルチパートアップロード (Go SDK V1)

最終更新日:Nov 29, 2025

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

注意事項

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

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

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

  • InitiateMultipartUpload、UploadPart、CompleteMultipartUpload 操作を含むマルチパートアップロードプロセスを完了するには、oss:PutObject 権限が必要です。詳細については、「RAM ユーザーへのカスタム権限の付与」をご参照ください。

  • Go SDK V2.2.5 以降では、次のサンプルコードに含まれるすべてのプロパティがサポートされています。

マルチパートアップロードの手順

マルチパートアップロードには、次の 3 つのステップが含まれます:

  1. マルチパートアップロードの初期化。

    Bucket.InitiateMultipartUpload メソッドを呼び出します。OSS はグローバルに一意なアップロード ID を返します。

  2. パートのアップロード。

    Bucket.UploadPart メソッドを呼び出して、各パートのデータをアップロードできます。

    説明
    • 同じアップロード ID の場合、パート番号はオブジェクト内でのパートの相対的な位置を示します。同じパート番号を使用して新しいデータをアップロードすると、OSS 内のそのパートの既存データは上書きされます。

    • OSS は、受信したパートデータの MD5 ハッシュを ETag ヘッダーで返します。

    • OSS はアップロードされたデータの MD5 ハッシュを計算し、SDK によって計算された MD5 ハッシュと比較します。2 つの MD5 ハッシュが一致しない場合、InvalidDigest エラーコードが返されます。

  3. マルチパートアップロードの完了。

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

サンプルコード

次のサンプルコードを使用して、完全なマルチパートアップロードを実行できます。

package main

import (
	"fmt"
	"log"
	"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 {
		log.Fatalf("Error: %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("Error: %v", err)
	}

	// バケット名を設定します。
	bucketName := "examplebucket"
	// オブジェクトの完全なパスを設定します。完全なパスにバケット名を含めることはできません。
	objectName := "exampleobject.txt"
	// ローカルファイルの完全なパスを設定します。ローカルパスを指定しない場合、ファイルはサンプルプログラムのプロジェクトに対応するローカルパスからアップロードされます。
	localFilename := "/localpath/exampleobject.txt"

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

	// パートサイズをバイト単位で設定します。この例では、パートサイズは 5 MB に設定されています。
	partSize := int64(5 * 1024 * 1024)

	// マルチパートアップロード関数を呼び出します。
	if err := uploadMultipart(bucket, objectName, localFilename, partSize); err != nil {
		log.Fatalf("Failed to upload multipart: %v", err)
	}

}

// マルチパートアップロード関数。
func uploadMultipart(bucket *oss.Bucket, objectName, localFilename string, partSize int64) error {
	// ローカルファイルをパートに分割します。
	chunks, err := oss.SplitFileByPartSize(localFilename, partSize)
	if err != nil {
		return fmt.Errorf("failed to split file into chunks: %w", err)
	}

	// ローカルファイルを開きます。
	file, err := os.Open(localFilename)
	if err != nil {
		return fmt.Errorf("failed to open file: %w", err)
	}
	defer file.Close()

	// ステップ 1:マルチパートアップロードイベントを初期化します。
	imur, err := bucket.InitiateMultipartUpload(objectName)
	if err != nil {
		return fmt.Errorf("failed to initiate multipart upload: %w", err)
	}

	// ステップ 2:パートをアップロードします。
	var parts []oss.UploadPart
	for _, chunk := range chunks {
		part, err := bucket.UploadPart(imur, file, chunk.Size, chunk.Number)
		if err != nil {
			// パートのアップロードに失敗した場合は、マルチパートアップロードタスクの中止を試みます。
			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)
	}

	// オブジェクトのアクセス制御リスト (ACL) を private に設定します。デフォルトでは、オブジェクトの ACL はバケットから継承されます。
	objectAcl := oss.ObjectACL(oss.ACLPrivate)

	// ステップ 3:マルチパートアップロードを完了します。
	_, err = bucket.CompleteMultipartUpload(imur, parts, objectAcl)
	if err != nil {
		// アップロードの完了に失敗した場合は、アップロードの中止を試みます。
		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

オブジェクト名をグループ化するために使用される文字。指定されたプレフィックスを含み、デリミタ文字が最初に現れる前にあるすべてのオブジェクト名は、1 つの要素としてグループ化されます。

MaxUploads

返すマルチパートアップロードイベントの最大数。デフォルト値と最大値はどちらも 1000 です。

KeyMarker

オブジェクト名が KeyMarker パラメーターの値より辞書順で大きいマルチパートアップロードイベント。このパラメーターを UploadIDMarker パラメーターと組み合わせて使用して、返す結果の開始位置を指定できます。

Prefix

返されるオブジェクト名に含める必要があるプレフィックス。クエリで Prefix パラメーターを使用した場合でも、返されるオブジェクト名にはプレフィックスが含まれることに注意してください。

UploadIDMarker

返す結果の開始位置。このパラメーターは KeyMarker パラメーターと組み合わせて使用されます。

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

  • 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)
    }
  • プレフィックスを file として指定します。

    ...
    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)
  • プレフィックスを 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 操作の詳細については、「InitiateMultipartUpload」をご参照ください。

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

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

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

  • アップロード済みのパートを一覧表示するための API 操作の詳細については、「ListUploadedParts」をご参照ください。

  • 開始されたがまだ完了または中止されていない、進行中のすべてのマルチパートアップロードイベントを一覧表示するための API 操作の詳細については、「ListMultipartUploads」をご参照ください。