このトピックでは、オブジェクトのアップロードまたはダウンロードのリクエストにパラメーターを追加して、アップロードまたはダウンロードの帯域幅を制限する方法について説明します。これにより、他のアプリケーションに十分な帯域幅を確保できます。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同じリージョン内の他の Alibaba Cloud サービスから Object Storage Service (OSS) にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、環境変数からアクセス認証情報を取得します。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名またはセキュリティトークンサービス (STS) を使用して OSSClient インスタンスを作成する場合は、「一般的なシナリオの設定例」をご参照ください。
シンプルアップロードとシンプルダウンロードにおける単一接続の帯域幅制限の設定
次のサンプルコードは、シンプルアップロードとシンプルダウンロードで単一接続の帯域幅制限を設定する方法の例です。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class Demo {
public static void main(String[] args) throws 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。
String objectName = "exampledir/exampleobject.txt";
// アップロードするローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。
// ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
String localFileName = "D:\\localpath\\examplefile.txt";
// オブジェクトをダウンロードする先の完全なパスを指定します。同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。それ以外の場合、ダウンロードされたオブジェクトはパスに保存されます。
// ダウンロードしたオブジェクトのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。
String downLoadFileName = "D:\\localpath\\exampleobject.txt";
// 帯域幅制限を 100 KB/s に設定します。
int limitSpeed = 100 * 1024 * 8;
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSS クライアントインスタンスを作成します。
// OSS クライアントが不要になったら、shutdown メソッドを呼び出して関連リソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// オブジェクトのアップロードに帯域幅制限を設定します。
InputStream inputStream = new FileInputStream(localFileName);
PutObjectRequest PutObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
PutObjectRequest.setTrafficLimit(limitSpeed);
ossClient.putObject(PutObjectRequest);
// オブジェクトのダウンロードに帯域幅制限を設定します。
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectName);
getObjectRequest.setTrafficLimit(limitSpeed);
File localFile = new File(downLoadFileName);
ossClient.getObject(getObjectRequest, localFile);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}マルチパートアップロードにおける単一接続の帯域幅制限の設定
次のコードは、マルチパートアップロードで単一接続の帯域幅制限を設定する方法の例です。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class 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。完全なパスにバケット名を含めないでください。
String objectName = "exampledir/exampleobject.txt";
// 帯域幅制限を 100 KB/s に設定します。
int limitSpeed = 100 * 1024 * 8;
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSS クライアントインスタンスを作成します。
// OSS クライアントが不要になったら、shutdown メソッドを呼び出して関連リソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// InitiateMultipartUploadRequest オブジェクトを作成します。
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
// マルチパートアップロードタスクを初期化します。
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
// アップロード ID を取得します。これはマルチパートアップロードタスクを一意に識別します。アップロード ID を使用して、マルチパートアップロードタスクのキャンセルやクエリなどの関連操作を実行できます。
String uploadId = upresult.getUploadId();
// partETags は PartETag のセットです。PartETag は、アップロードされたパートのパート番号と ETag で構成されます。
List<PartETag> partETags = new ArrayList<PartETag>();
// 各パートのサイズを指定します。これはオブジェクトのパート数を計算するために使用されます。単位: バイト。
final long partSize = 1 * 1024 * 1024L; // パートサイズを 1 MB に設定します。
// アップロードするローカルファイルの完全なパスを指定します。デフォルトでは、ローカルファイルの完全なパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
final File sampleFile = new File("D:\\localpath\\examplefile.txt");
long fileLength = sampleFile.length();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
// すべてのパートをアップロードします。
for (int i = 0; i < partCount; 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);
// パートがアップロードされるたびに、OSS は PartETag を含む結果を返します。PartETag は partETags に保存されます。
partETags.add(uploadPartResult.getPartETag());
}
// CompleteMultipartUploadRequest オブジェクトを作成します。
// CompleteMultipartUpload 操作を呼び出すときは、すべての有効な PartETag を提供する必要があります。OSS が PartETag を受信すると、OSS はすべてのパートを 1 つずつ検証します。すべてのパートが検証されると、OSS はこれらのパートを結合して完全なオブジェクトを作成します。
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
// マルチパートアップロードタスクを完了します。
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
System.out.println(completeMultipartUploadResult.getETag());
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}署名付き URL を使用したアップロードとダウンロードにおける帯域幅制限の設定
次のサンプルコードは、署名付き URL を使用してオブジェクトをアップロードまたはダウンロードする際に、単一接続の帯域幅制限を設定する方法の例です。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.GetObjectRequest;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws 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。
String objectName = "exampledir/exampleobject.txt";
// アップロードするローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。
// ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。
String localFileName = "D:\\localpath\\examplefile.txt";
// オブジェクトをダウンロードする先の完全なパスを指定します。同じ名前のファイルが既に存在する場合、ダウンロードされたオブジェクトはファイルを上書きします。それ以外の場合、ダウンロードされたオブジェクトはパスに保存されます。
// ダウンロードしたオブジェクトのパスを指定しない場合、ダウンロードしたオブジェクトはサンプルプログラムが属するプロジェクトのパスに保存されます。
String downLoadFileName = "D:\\localpath\\exampleobject.txt";
// 帯域幅制限を 100 KB/s に設定します。
int limitSpeed = 100 * 1024 * 8;
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSS クライアントインスタンスを作成します。
// OSS クライアントが不要になったら、shutdown メソッドを呼び出して関連リソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// オブジェクトアップロード用の帯域幅制限パラメーターを含む署名付き URL を生成し、URL の有効期間を 60 秒に設定します。
Date date = new Date();
date.setTime(date.getTime() + 60 * 1000);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
request.setExpiration(date);
request.setTrafficLimit(limitSpeed);
URL signedUrl = ossClient.generatePresignedUrl(request);
System.out.println("put object url" + signedUrl);
// オブジェクトのアップロードに帯域幅制限を設定します。
InputStream inputStream = new FileInputStream(localFileName);
ossClient.putObject(signedUrl, inputStream, -1, null, true);
// オブジェクトダウンロード用の帯域幅制限パラメーターを含む署名付き URL を生成し、URL の有効期間を 60 秒に設定します。
date = new Date();
date.setTime(date.getTime() + 60 * 1000);
request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
request.setExpiration(date);
request.setTrafficLimit(limitSpeed);
signedUrl = ossClient.generatePresignedUrl(request);
System.out.println("get object url" + signedUrl);
// オブジェクトのダウンロードに帯域幅制限を設定します。
GetObjectRequest getObjectRequest = new GetObjectRequest(signedUrl, null);
ossClient.getObject(getObjectRequest, new File(downLoadFileName));
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}関連ドキュメント
単一接続の帯域幅制限の完全なサンプルコードについては、GitHub をご参照ください。