このトピックでは、オブジェクトのアップロードまたはダウンロード要求にパラメーターを追加して、アップロードまたはダウンロード帯域幅の制限を設定する方法について説明します。 これにより、他のアプリケーションに十分な帯域幅が確保されます。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。
単純なアップロードとダウンロードのための単一接続帯域幅調整の設定
次のサンプルコードは、単純なアップロードとダウンロードのために単一接続帯域幅スロットリングを構成する方法の例を示しています。
com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo del.GetObjectRequestをインポートします。com.aliyun.oss.mo del.PutObjectRequestをインポートします。java.io. ファイルをインポートします。java.io.FileInputStreamをインポートします。java.io.InputStreamをインポートします。public classデモ {
public static void main(String[] args) Throwable {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。 例: examplebucket.
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。
文字列objectName = "exampledir/exampleobject.txt";
// アップロードするローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。
// ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
文字列localFileName = "D :\\ localpath\\examplefile.txt";
// オブジェクトをダウンロードするフルパスを指定します。 同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。 それ以外の場合、ダウンロードされたオブジェクトはパスに保存されます。
// ダウンロードしたオブジェクトのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。
String downLoadFileName = "D :\\ localpath\\exampleobject.txt";
// 帯域幅制限を100 KB/sに設定します。
int limitSpeed = 100*1024*8;
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// オブジェクトのアップロードの帯域幅調整を設定します。
InputStream inputStream=新しいFileInputStream(localFileName);
PutObjectRequest=新しいPutObjectRequest(bucketName, objectName, inputStream);
PutObjectRequest.setTrafficLimit(limitSpeed);
ossClient.putObject(PutObjectRequest);
// オブジェクトダウンロードの帯域幅調整を設定します。
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectName);
getObjectRequest.setTrafficLimit(limitSpeed);
ファイルlocalFile=新しいファイル (downLoadFileName);
ossClient.getObject(getObjectRequest, localFile);
} catch (Exception e) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "しかし、何らかの理由でエラー応答で拒否されました。");
System.out.println("エラーメッセージ:" + oe.getErrorMessage());
System.out.println("エラーコード:" + oe.getErrorCode());
System.out.println("リクエストID:" + oe.getRequestId());
System.out.println("ホストID:" + oe.getHostId());
} catch (ClientException e) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ 「ネットワークにアクセスできないなど」;
System.out.println("エラーメッセージ:" + ce.getMessage());
} 最後に{
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
マルチパートアップロードのシングル接続帯域幅スロットリングの設定
次のコードは、マルチパートアップロードのシングル接続帯域幅スロットリングを設定する方法の例を示しています。
com.aliyun.oss.mo delをインポートします。*;
java.io. ファイルをインポートします。java.io.FileInputStreamをインポートします。java.io.InputStreamをインポートします。java.util.ArrayListをインポートします。java.util.Listをインポートします。パブリッククラスDemoApi2 {
public static void main(String[] args) throws Exception {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。 例: examplebucket.
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。
文字列objectName = "exampledir/exampleobject.txt";
// 帯域幅制限を100 KB/sに設定します。
int limitSpeed = 100*1024*8;
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// InitiateMultipartUploadRequestオブジェクトを作成します。
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
// マルチパートアップロードタスクを初期化します。
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
// マルチパートアップロードタスクを一意に識別するアップロードIDを取得します。 アップロードIDを使用して、マルチパートアップロードタスクのキャンセルやクエリなどの関連操作を実行できます。
String uploadId = upresult.getUploadId();
// partETagsはPartETagsのセットです。 PartETagは、アップロードされた部品の部品番号とETagで構成されます。
List<PartETag> partETags = new ArrayList<PartETag>();
// 各パーツのサイズを指定します。これは、オブジェクトのパーツ数の計算に使用されます。 単位:バイト
final long partSize = 1*1024 * 1024L; // パーツサイズを1 MBに設定します。
// アップロードするローカルファイルのフルパスを指定します。 デフォルトでは、ローカルファイルのフルパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
final File sampleFile = newファイル ("D :\\ localpath\\examplefile.txt");
long fileLength = sampleFile.length();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
// すべての部品をアップロードします。
for (int i = 0; i <recordCount; i ++ ) {
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
InputStream instream = new FileInputStream(sampleFile);
// アップロードされたパーツをスキップします。
instream.skip(startPos);
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setKey(objectName);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setInputStream(instream);
// 各パーツのサイズを指定します。 最後の部分を除く各部分は100 KB以上でなければなりません。
uploadPartRequest.setPartSize(curPartSize);
// 部品番号を指定します。 各部品は部品番号を有する。 数は1から10000の範囲です。 指定された数値が範囲を超えている場合、OSSはInvalidArgumentエラーコードを返します。
uploadPartRequest.setPartNumber( i + 1);
// 帯域幅の制限を指定します。
uploadPartRequest.setTrafficLimit(limitSpeed);
// 部品は必ずしも順番にアップロードされません。 さまざまなOSSクライアントからアップロードできます。 OSSは部品番号に基づいて部品をソートし、それらを結合して完全なオブジェクトにします。
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
// パーツがアップロードされるたびに、PartETagを含む結果が返されます。 PartETagsはpartETagsに格納されます。
partETags.add(uploadPartResult.getPartETag());
}
// CompleteMultipartUploadRequestオブジェクトを作成します。
// CompleteMultipartUpload操作を呼び出すときは、すべての有効なPartETagsを指定する必要があります。 OSSがPartETagsを受信すると、OSSはすべてのパーツを1つずつ検証します。 すべての部品が検証された後、OSSはこれらの部品を完全なオブジェクトに結合します。
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
// マルチパートアップロードタスクを完了します。
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
System.out.println(completeMultipartUploadResult.getETag());
} catch (Exception e) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "しかし、何らかの理由でエラー応答で拒否されました。");
System.out.println("エラーメッセージ:" + oe.getErrorMessage());
System.out.println("エラーコード:" + oe.getErrorCode());
System.out.println("リクエストID:" + oe.getRequestId());
System.out.println("ホストID:" + oe.getHostId());
} catch (ClientException e) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ 「ネットワークにアクセスできないなど」;
System.out.println("エラーメッセージ:" + ce.getMessage());
} 最後に{
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
署名付きURLを使用するアップロードとダウンロードの帯域幅調整を構成する
次のサンプルコードでは、署名付きURLを使用してオブジェクトをアップロードまたはダウンロードする場合に、単一接続帯域幅スロットリングを構成する方法の例を示します。
com.aliyun.oss.*;
impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.mo del.GeneratePresignedUrlRequestをインポートします。com.aliyun.oss.mo del.GetObjectRequestをインポートします。java.io. ファイルをインポートします。java.io.FileInputStreamをインポートします。java.io.InputStreamをインポートします。impor t java.net.URL;
java.util.Dateをインポートします。public classデモ {
public static void main(String[] args) Throwable {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。 例: examplebucket.
String bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。
文字列objectName = "exampledir/exampleobject.txt";
// アップロードするローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。
// ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
文字列localFileName = "D :\\ localpath\\examplefile.txt";
// オブジェクトをダウンロードするフルパスを指定します。 同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。 それ以外の場合、ダウンロードされたオブジェクトはパスに保存されます。
// ダウンロードしたオブジェクトのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。
String downLoadFileName = "D :\\ localpath\\exampleobject.txt";
// 帯域幅制限を100 KB/sに設定します。
int limitSpeed = 100*1024*8;
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// オブジェクトアップロードの帯域幅調整パラメーターを含む署名付きURLを生成し、URLの有効期間を60秒に設定します。
Date date = new Date();
date.setTime(date.getTime() + 60*1000);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
request.setExpiration (日付);
request.setTrafficLimit(limitSpeed);
URL signedUrl = ossClient.generatePresignedUrl(request);
System.out.println("put object url" + signedUrl);
// オブジェクトのアップロードの帯域幅調整を設定します。
InputStream inputStream=新しいFileInputStream(localFileName);
ossClient.putObject(signedUrl, inputStream, -1, null, true);
// オブジェクトダウンロードの帯域幅調整パラメーターを含む署名付きURLを生成し、URLの有効期間を60秒に設定します。
date = new日付 ();
date.setTime(date.getTime() + 60*1000);
request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
request.setExpiration (日付);
request.setTrafficLimit(limitSpeed);
signedUrl = ossClient.generatePresignedUrl (要求);
System.out.println("get object url" + signedUrl);
// オブジェクトダウンロードの帯域幅調整を設定します。
GetObjectRequest getObjectRequest = new GetObjectRequest(signedUrl、null);
ossClient.getObject(getObjectRequest, new File(downLoadFileName));
} catch (Exception e) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "しかし、何らかの理由でエラー応答で拒否されました。");
System.out.println("エラーメッセージ:" + oe.getErrorMessage());
System.out.println("エラーコード:" + oe.getErrorCode());
System.out.println("リクエストID:" + oe.getRequestId());
System.out.println("ホストID:" + oe.getHostId());
} catch (ClientException e) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ 「ネットワークにアクセスできないなど」;
System.out.println("エラーメッセージ:" + ce.getMessage());
} 最後に{
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
参考資料
シングル接続帯域幅調整の完全なサンプルコードについては、『GitHub』をご参照ください。