このページは機械翻訳によるものです。内容の正確さは保証しておりません。 人力翻訳を依頼する

マルチパートコピーを使用したオブジェクトのコピー

更新日時2025-01-07 07:12

このトピックでは、Object Storage Service (OSS) SDK for Go 2.0のUploadPartCopy操作を呼び出して、マルチパートコピーを使用して、ソースバケットから同じリージョンの宛先バケットにオブジェクトをコピーする方法について説明します。 宛先バケットは、ソースバケットまたは別のバケットにすることができます。

使用上の注意

  • このトピックのサンプルコードでは、中国 (杭州) リージョンのリージョンID cn-hangzhouを使用しています。 デフォルトでは、パブリックエンドポイントはバケット内のリソースにアクセスするために使用されます。 バケットが配置されているのと同じリージョンにある他のAlibaba Cloudサービスを使用してバケット内のリソースにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

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

  • オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、ターゲットバケットに対する読み取りおよび書き込み権限が必要です。

  • ソースバケットと宛先バケットは同じリージョンにある必要があります。 たとえば、中国 (杭州) リージョンにあるバケット内のオブジェクトを、中国 (青島) リージョンにある別のバケットにコピーすることはできません。

  • ソースバケットとターゲットバケットに保持ポリシーが設定されていないことを確認します。 それ以外の場合、次のエラーメッセージが返されます。指定したオブジェクトは不変です。

移動方法

func (c *Client) UploadPartCopy(ctx context.Context, request *UploadPartCopyRequest, optFns ...func(*Options)) (*UploadPartCopyResult, error)

リクエストパラメーター

パラメーター

データ型

説明

パラメーター

データ型

説明

ctx

context.Context

リクエストのコンテキスト。リクエストの合計期間を指定するために使用できます。

request

* UploadPartCopyRequest

特定のAPI操作のパラメーター。 詳細については、「UploadPartCopyRequest」をご参照ください。

optFns

. .. func(* オプション)

オプションのパラメーター。 詳細については、「オプション」をご参照ください。

応答パラメーター

パラメーター

データ型

説明

パラメーター

データ型

説明

result

* UploadPartCopyResult

操作への応答。 このパラメーターは、errの値がnilの場合に有効です。 詳細については、「UploadPartCopyResult」をご参照ください。

err

error

リクエストのステータス。 要求が失敗した場合、errの値はnilにできません。

マルチパートコピープロセス

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

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

    Client.InitiateMultipartUploadメソッドを使用して、OSSで一意のアップロードIDを取得します。

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

    Client.UploadPartCopyメソッドを使用してパーツをアップロードします。

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

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

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

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

    すべてのパーツをアップロードしたら、Client.CompleteMultipartUploadメソッドを使用して、これらのパーツを完全なオブジェクトに結合します。

次のサンプルコードでは、マルチパートコピーを使用してオブジェクトをソースバケットから宛先バケットにコピーし、パーツを結合して完全なオブジェクトにする方法の例を示します。

package main

import (
	"context"
	"flag"
	"log"
	"sync"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// Specify the global variables.
var (
	region         string // The region.
	srcBucketName string // The name of the source bucket.
	srcObjectName string // The name of the source object.
	destBucketName string // The name of the destination bucket.
	destObjectName string // The name of the destination object.
)

// Specify the init function used to initialize command line parameters.
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&srcBucketName, "src-bucket", "", "The name of the source bucket.")
	flag.StringVar(&srcObjectName, "src-object", "", "The name of the source object.")
	flag.StringVar(&destBucketName, "dest-bucket", "", "The name of the destination bucket.")
	flag.StringVar(&destObjectName, "dest-object", "", "The name of the destination object.")
}

func main() {
	// Parse command line parameters.
	flag.Parse()

	// Specify the upload ID.
	var uploadId string

	// Check whether the source bucket name is empty.
	if len(srcBucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source bucket name required")
	}

	// Check whether the region is empty.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// If the destination bucket name is not specified, the source bucket name is used.
	if len(destBucketName) == 0 {
		destBucketName = srcBucketName
	}

	// Check whether the source object name is empty.
	if len(srcObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, source object name required")
	}

	// Check whether the destination object name is empty.
	if len(destObjectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, destination object name required")
	}

	// Load the default configurations and specify the credential provider and region.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Create an OSS client.
	client := oss.NewClient(cfg)

	// Initialize the multipart upload request.
	initRequest := &oss.InitiateMultipartUploadRequest{
		Bucket: oss.Ptr(destBucketName),
		Key:    oss.Ptr(destObjectName),
	}
	initResult, err := client.InitiateMultipartUpload(context.TODO(), initRequest)
	if err != nil {
		log.Fatalf("failed to initiate multipart upload %v", err)
	}

	// Display the result of multipart copy.
	log.Printf("initiate multipart upload result:%#v\n", *initResult.UploadId)
	uploadId = *initResult.UploadId

	// Initialize the wait group and mutual exclusion (mutex).
	var wg sync.WaitGroup
	var parts []oss.UploadPart
	count := 3
	var mu sync.Mutex

	// Start multiple goroutines for multipart upload.
	for i := 0; i < count; i++ {
		wg.Add(1)
		go func(partNumber int, i int) {
			defer wg.Done()

			// Create the multipart upload request.
			partRequest := &oss.UploadPartCopyRequest{
				Bucket:       oss.Ptr(destBucketName), // The name of the destination bucket.
				Key:          oss.Ptr(destObjectName), // The name of the destination object.
				SourceBucket: oss.Ptr(srcBucketName), // The name of the source bucket.
				SourceKey:     oss.Ptr(srcObjectName), // The name of the source object.
				PartNumber: int32(partNumber), // The part number.
				const uploadId = '<Upload Id>'; // The upload ID of the multipart upload task.
			}

			// Send the multipart upload request.
			partResult, err := client.UploadPartCopy(context.TODO(), partRequest)
			if err != nil {
				log.Fatalf("failed to upload part copy %d: %v", partNumber, err)
			}

			// Record the multipart upload result.
			part := oss.UploadPart{
				PartNumber: partRequest.PartNumber,
				ETag:       partResult.ETag,
			}

			// Use the mutex to protect shared data.
			mu.Lock()
			parts = append(parts, part)
			mu.Unlock()
		}(i+1, i)
	}

	// Wait until all goroutines are complete.
	wg.Wait()

	// Complete the multipart upload request.
	request := &oss.CompleteMultipartUploadRequest{
		Bucket:   oss.Ptr(destBucketName),
		Key:      oss.Ptr(destObjectName),
		UploadId: oss.Ptr(uploadId),
		CompleteMultipartUpload: &oss.CompleteMultipartUpload{
			Parts: parts,
		},
	}
	result, err := client.CompleteMultipartUpload(context.TODO(), request)
	if err != nil {
		log.Fatalf("failed to complete multipart upload %v", err)
	}

	// Display the result.
	log.Printf("complete multipart upload result:%#v\n", result)
}

関連ドキュメント

  • マルチパートコピーを使用してオブジェクトをコピーするために使用される完全なサンプルコードについては、GitHubをご覧ください。

  • マルチパートアップロードタスクを開始するために呼び出すことができるAPI操作の詳細については、InitiateMultipartUploadをご覧ください。

  • マルチパートコピーを使用してオブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「UploadPartCopy」をご参照ください。

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

  • 目次 (1, M)
  • 使用上の注意
  • 移動方法
  • マルチパートコピープロセス
  • 関連ドキュメント
フィードバック
phone お問い合わせ

Chat now with Alibaba Cloud Customer Service to assist you in finding the right products and services to meet your needs.

alicare alicarealicarealicare