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

Object Storage Service:シングル接続の帯域幅スロットリング (Go SDK V1)

最終更新日:Nov 29, 2025

このトピックでは、オブジェクトのアップロードまたはダウンロードリクエストにパラメーターを追加して、アップロードまたはダウンロードの帯域幅の上限を設定する方法について説明します。これにより、他のアプリケーションに十分な帯域幅を確保できます。

注意事項

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

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

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

サンプルコード

次のサンプルコードは、シンプルアップロードとシンプルダウンロードのシングル接続の帯域幅スロットリングを設定する方法の例です。

package main

import (
	"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("Failed to create credentials provider: %v", err)
	}

	// OSSClient インスタンスを作成します。
	// yourEndpoint を、バケットが設置されているリージョンのエンドポイントに設定します。例えば、中国 (杭州) リージョンの場合は、https://oss-cn-hangzhou.aliyuncs.com を使用します。他のリージョンの場合は、実際のエンドポイントを使用してください。
	// yourRegion を、バケットが設置されているリージョンに設定します。例えば、中国 (杭州) リージョンの場合は、cn-hangzhou を使用します。他のリージョンの場合は、実際のリージョンを使用してください。
	options := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	options = append(options, oss.Region("yourRegion"))
	// 署名バージョンを設定します。
	options = append(options, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", options...)
	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)
	}

	// アップロードするローカルファイルの完全なパスを設定します。例:D:\\localpath\\examplefile.txt
	// ローカルパスを指定しない場合、ファイルはプロジェクトのデフォルトのローカルパスからアップロードされます。
	localFilePath := "D:\\localpath\\examplefile.txt"
	fd, err := os.Open(localFilePath)
	if err != nil {
		log.Fatalf("Failed to open local file '%s': %v", localFilePath, err)
	}
	defer fd.Close()

	// アップロード速度の上限を設定します。値は数値で、デフォルトの単位は bit/s です。この例では、上限を 5 MB/s に設定します。
	var traffic int64 = 41943040

	// 帯域幅スロットリングを使用してファイルをアップロードします。
	// オブジェクトの完全なパスを設定します。完全なパスにバケット名を含めることはできません。
	objectName := "exampledir/exampleobject.txt"
	err = bucket.PutObject(objectName, fd, oss.TrafficLimitHeader(traffic))
	if err != nil {
		log.Fatalf("Failed to upload object '%s': %v", objectName, err)
	}

	// 帯域幅スロットリングを使用してファイルをダウンロードします。
	// オブジェクトの完全なパス (例:exampledir/exampleobject.txt) とローカルファイルの完全なパス (例:D:\\localpath\\exampleobject.txt) を設定します。オブジェクトの完全なパスにバケット名を含めることはできません。
	downloadFilePath := "D:\\localpath\\exampleobject.txt"
	err = bucket.GetObjectToFile(objectName, downloadFilePath, oss.TrafficLimitHeader(traffic))
	if err != nil {
		log.Fatalf("Failed to download object '%s' to '%s': %v", objectName, downloadFilePath, err)
	}

	log.Println("Upload and download completed successfully")
}

シナリオ

マルチパートアップロードのシングル接続の帯域幅スロットリングの設定

次のコードは、マルチパートアップロードのシングル接続の帯域幅スロットリングを設定する方法の例です。

package main

import (
	"io"
	"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("Failed to create credentials provider: %v", err)
	}

	// OSSClient インスタンスを作成します。
	// yourEndpoint を、バケットが設置されているリージョンのエンドポイントに設定します。例えば、中国 (杭州) リージョンの場合は、https://oss-cn-hangzhou.aliyuncs.com を使用します。他のリージョンの場合は、実際のエンドポイントを使用してください。
	// yourRegion を、バケットが設置されているリージョンに設定します。例えば、中国 (杭州) リージョンの場合は、cn-hangzhou を使用します。他のリージョンの場合は、実際のリージョンを使用してください。
	options := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	options = append(options, oss.Region("yourRegion"))
	// 署名バージョンを設定します。
	options = append(options, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", options...)
	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)
	}

	// アップロード速度の上限を設定します。値は数値で、デフォルトの単位は bit/s です。この例では、上限を 5 MB/s に設定します。
	traffic := int64(41943040)

	// マルチパートアップロードを使用して大きなファイルをアップロードします。
	// ファイルを 3 つのパートに分割します。ファイルサイズに基づいてパート数を設定できます。
	localFilePath := "localFile"
	chunks, err := oss.SplitFileByPartNum(localFilePath, 3)
	if err != nil {
		log.Fatalf("Failed to split file '%s': %v", localFilePath, err)
	}

	// ファイルを開きます。
	fd, err := os.Open(localFilePath)
	if err != nil {
		log.Fatalf("Failed to open local file '%s': %v", localFilePath, err)
	}
	defer fd.Close()

	// アップロード用のファイルを初期化します。
	objectName := "exampledir/exampleobject.txt"
	imur, err := bucket.InitiateMultipartUpload(objectName)
	if err != nil {
		log.Fatalf("Failed to initiate multipart upload for '%s': %v", objectName, err)
	}

	// 帯域幅スロットリングを使用してパートをアップロードします。
	var parts []oss.UploadPart
	for _, chunk := range chunks {
		_, err := fd.Seek(chunk.Offset, io.SeekStart)
		if err != nil {
			log.Fatalf("Failed to seek to offset %d in file '%s': %v", chunk.Offset, localFilePath, err)
		}
		part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number, oss.TrafficLimitHeader(traffic))
		if err != nil {
			log.Fatalf("Failed to upload part %d of '%s': %v", chunk.Number, objectName, err)
		}
		parts = append(parts, part)
	}

	// アップロードを完了します。
	_, err = bucket.CompleteMultipartUpload(imur, parts)
	if err != nil {
		log.Fatalf("Failed to complete multipart upload for '%s': %v", objectName, err)
	}

	log.Println("Multipart upload completed successfully")
}

追加アップロードのシングル接続の帯域幅スロットリングの設定

次のコードは、追加アップロードのシングル接続の帯域幅スロットリングを設定する方法の例です。

package main

import (
	"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("Failed to create credentials provider: %v", err)
	}

	// OSSClient インスタンスを作成します。
	// yourEndpoint を、バケットが設置されているリージョンのエンドポイントに設定します。例えば、中国 (杭州) リージョンの場合は、https://oss-cn-hangzhou.aliyuncs.com を使用します。他のリージョンの場合は、実際のエンドポイントを使用してください。
	// yourRegion を、バケットが設置されているリージョンに設定します。例えば、中国 (杭州) リージョンの場合は、cn-hangzhou を使用します。他のリージョンの場合は、実際のリージョンを使用してください。
	options := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	options = append(options, oss.Region("yourRegion"))
	// 署名バージョンを設定します。
	options = append(options, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", options...)
	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)
	}

	// アップロード速度の上限を設定します。値は数値で、デフォルトの単位は bit/s です。この例では、上限を 5 MB/s に設定します。
	traffic := int64(41943040)

	// アップロードを追加します。
	// localFileOne と localFileTwo は、アップロードする 2 つのローカルファイルの完全なパスです。localFileOne がアップロードされた後、localFileTwo がそれに追加されます。
	localFileOne := "localFileOne"
	localFileTwo := "localFileTwo"

	// 最初のファイルを開きます。
	fd1, err := os.Open(localFileOne)
	if err != nil {
		log.Fatalf("Failed to open local file '%s': %v", localFileOne, err)
	}
	defer fd1.Close()

	// 2 番目のファイルを開きます。
	fd2, err := os.Open(localFileTwo)
	if err != nil {
		log.Fatalf("Failed to open local file '%s': %v", localFileTwo, err)
	}
	defer fd2.Close()

	// オブジェクトの完全なパスを定義します。
	objectName := "exampledir/exampleobject.txt"

	// nextPos を初期化します。
	var nextPos int64

	// 最初のファイルを追加します。
	nextPos, err = bucket.AppendObject(objectName, fd1, nextPos, oss.TrafficLimitHeader(traffic))
	if err != nil {
		log.Fatalf("Failed to append object '%s' from file '%s': %v", objectName, localFileOne, err)
	}

	// 2 番目のファイルを追加します。
	nextPos, err = bucket.AppendObject(objectName, fd2, nextPos, oss.TrafficLimitHeader(traffic))
	if err != nil {
		log.Fatalf("Failed to append object '%s' from file '%s': %v", objectName, localFileTwo, err)
	}

	log.Println("Append upload completed successfully")
}

署名付き URL を使用したアップロードとダウンロードのシングル接続の帯域幅スロットリングの設定

次のコードは、署名付き URL を使用してファイルをアップロードおよびダウンロードする際に、シングル接続の帯域幅スロットリングを設定する方法の例です。

package main

import (
	"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("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)
	}

	// 署名付き URL を使用してファイルをアップロードします。
	// ローカルファイルの完全なパスを設定します。例:D:\\localpath\\exampleobject.txt
	localFilePath := "D:\\localpath\\exampleobject.txt"
	fd, err := os.Open(localFilePath)
	if err != nil {
		log.Fatalf("Failed to open local file '%s': %v", localFilePath, err)
	}
	defer fd.Close()

	// アップロード速度の上限を設定します。値は数値で、デフォルトの単位は bit/s です。この例では、上限を 5 MB/s に設定します。
	traffic := int64(41943040)

	// ファイルをアップロードするための URL を取得します。
	// オブジェクトの完全なパスを設定します。完全なパスにバケット名を含めることはできません。
	objectName := "exampledir/exampleobject.txt"
	strURL, err := bucket.SignURL(objectName, oss.HTTPPut, 60, oss.TrafficLimitParam(traffic))
	if err != nil {
		log.Fatalf("Failed to generate signed URL for uploading '%s': %v", objectName, err)
	}

	// ローカルファイルをアップロードします。
	err = bucket.PutObjectWithURL(strURL, fd)
	if err != nil {
		log.Fatalf("Failed to upload object '%s': %v", objectName, err)
	}

	// 署名付き URL を使用してファイルをダウンロードします。
	// ファイルをダウンロードするための URL を取得します。
	strURL, err = bucket.SignURL(objectName, oss.HTTPGet, 60, oss.TrafficLimitParam(traffic))
	if err != nil {
		log.Fatalf("Failed to generate signed URL for downloading '%s': %v", objectName, err)
	}

	// オブジェクトをダウンロードするローカルファイルの完全なパスを設定します。
	downloadFilePath := "D:\\localpath\\exampleobject.txt"
	err = bucket.GetObjectToFileWithURL(strURL, downloadFilePath)
	if err != nil {
		log.Fatalf("Failed to download object '%s' to '%s': %v", objectName, downloadFilePath, err)
	}

	log.Println("Upload and download completed successfully")
}

関連ドキュメント

  • ファイルのアップロードに関する API 操作の詳細については、「PutObject」をご参照ください。

  • ファイルのダウンロードに関する API 操作の詳細については、「GetObjectToFile」をご参照ください。