このトピックでは、オブジェクトのアップロードまたはダウンロード要求にパラメーターを追加して、アップロードまたはダウンロード帯域幅の制限を設定する方法について説明します。 これにより、他のアプリケーションに十分な帯域幅が確保されます。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。
単純なアップロードとダウンロードのための単一接続帯域幅調整の設定
次のサンプルコードは、単純なアップロードとダウンロードのために単一接続帯域幅スロットリングを構成する方法の例を示しています。
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
oss2.modelsからOSS_TRAFFIC_LIMITをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
# バケットの名前を指定します。
bucket = oss2.Bucket(auth, 'yourEndpoint', 'examplebucket')
# オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
# アップロードするローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 デフォルトでは、ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
local_file_name = 'D :\\ localpath\\examplefile.txt'
# オブジェクトをダウンロードするローカルパスを指定します。 同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。 同じ名前のファイルが存在しない場合、ダウンロードしたオブジェクトはパスに保存されます。
# ダウンロードしたオブジェクトのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。
down_file_name = 'D :\\ localpath\\exampleobject.txt'
# headersパラメーターを設定して、帯域幅制限を100 KB/s (819,200 bit/s) に設定します。
limit_speed = (100*1024*8)
headers = dict()
ヘッダー [OSS_TRAFFIC_LIMIT] = str(limit_speed);
# オブジェクトのアップロードの帯域幅調整を設定します。
result = bucket.put_object_from_file(object_name, local_file_name, headers=headers)
print('http response status:', result.status)
# オブジェクトダウンロードの帯域幅調整を設定します。
result = bucket.get_object_to_file(object_name, down_file_name, headers=headers)
print('http response status:', result.status)
マルチパートアップロードのシングル接続帯域幅スロットリングの設定
次のサンプルコードは、マルチパートアップロードのシングル接続帯域幅スロットリングを設定する方法の例を示しています。
# -*-コーディング: utf-8 -*-
osのインポート
oss2インポートSizedFileAdapterから、determine_part_size
oss2.headersからOSS_TRAFFIC_LIMITをインポート
oss2.modelsからPartInfoをインポート
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
# バケットの名前を指定します。 例: examplebucket.
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めることはできません。 例: exampledir/exampleobject.txt。
key = 'exampledir/exampleobject.txt'
# アップロードするローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。
filename = 'D :\\ localpath\\examplefile.txt'
total_size = os.path.getsize (ファイル名)
# determine_part_sizeメソッドを使用して、部品サイズを決定します。
part_size = determine_part_size(total_size, preferred_size=100*1024)
# マルチパートアップロードタスクを開始します。
upload_id = bucket.init_multipart_upload(key).upload_id
parts = []
# headersパラメーターを設定して、帯域幅制限を100 KB/s (819,200 bit/s) に設定します。
limit_speed = (100*1024*8)
headers = dict()
ヘッダー [OSS_TRAFFIC_LIMIT] = str(limit_speed);
# パーツを1つずつアップロードします。
with open(filename, 'rb') as fileobj:
part_number = 1
offset = 0
while offset < total_size:
num_to_upload = min(part_size, total_size - offset)
# SizedFileAdapter(fileobj, size) メソッドを呼び出して、新しいオブジェクトを生成し、追加操作の開始位置を再計算します。
result = bucket.upload_part(key, upload_id, part_number,
SizedFileAdapter(fileobj, num_to_upload), headers=headers)
parts.append(PartInfo(part_number, result.etag))
offset += num_to_upload
part_number += 1
# マルチパートアップロードタスクを完了します。
# 次のコードは、マルチパートアップロードタスクを完了するときにヘッダーを設定する方法の例を示しています。headers = dict()
# オブジェクトのアクセス制御リスト (ACL) を指定します。 この例では、このパラメーターはOBJECT_ACL_PRIVATEに設定され、オブジェクトのACLがプライベートであることを示します。
# headers["x-oss-object-acl"] = oss2.OBJECT_ACL_PRIVATE
bucket.com plete_multipart_upload(key, upload_id, parts, headers=headers)
# bucket.com plete_multipart_upload(key, upload_id, parts)
# マルチパートアップロードタスクの結果を確認します。
with open(filename, 'rb') as fileobj:
assert bucket.get_object(key).read() == fileobj.read()
署名付きURLを使用するアップロードとダウンロードの帯域幅調整を構成する
次のサンプルコードでは、署名付きURLを使用してオブジェクトをアップロードまたはダウンロードする場合に、単一接続帯域幅スロットリングを設定する方法の例を示します。
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
oss2.modelsからOSS_TRAFFIC_LIMITをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
# バケットの名前を指定します。
bucket = oss2.Bucket(auth, 'yourEndpoint', 'examplebucket')
# オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
# アップロードするローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 デフォルトでは、ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
local_file_name = 'D :\\ localpath\\examplefile.txt'
# オブジェクトをダウンロードするローカルパスを指定します。 同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。 同じ名前のファイルが存在しない場合、ダウンロードしたオブジェクトはパスに保存されます。
# ダウンロードしたオブジェクトのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。
down_file_name = 'D :\\ localpath\\exampleobject.txt'
# paramsパラメーターを設定して、帯域幅制限を100 KB/s (819,200ビット /s) に設定します。
limit_speed = (100*1024*8)
params = dict()
params[OSS_TRAFFIC_LIMIT] = str(limit_speed);
# オブジェクトアップロードの帯域幅調整パラメーターを含む署名付きURLを生成し、URLの有効期間を60秒に設定します。
url = bucket.sign_url('PUT', object_name, 60, params=params)
print('put object url:', url)
# オブジェクトのアップロードの帯域幅調整を設定します。
result = bucket.put_object_with_url_from_file(url, local_file_name)
print('http response status:', result.status)
# オブジェクトダウンロードの帯域幅調整パラメーターを含む署名付きURLを生成し、URLの有効期間を60秒に設定します。
url = bucket.sign_url('GET', object_name, 60, params=params)
print('get object url:'、url)
# オブジェクトダウンロードの帯域幅調整を設定します。
result = bucket.get_object_with_url_to_file(url, down_file_name)
print('http response status:', result.status)
参考資料
シングル接続帯域幅調整の完全なサンプルコードについては、『GitHub』をご参照ください。