このトピックでは、Security Token Service (STS) と署名付きURLをそれぞれ使用して、Object Storage Service (OSS) への一時アクセスを許可する方法について説明します。
使用上の注意
一時アクセス資格情報と署名付きURLには、有効期間を指定する必要があります。 一時的なアクセス資格情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付きURLを生成する場合、最小有効期間が優先されます。 たとえば、STSによって提供される一時的なアクセス資格情報の有効期間を1,200秒に設定し、資格情報を使用して生成された署名付きURLの有効期間を3,600秒に設定できます。 この場合、署名付きURLが有効期間内であっても、一時アクセス資格情報の有効期限が切れた後は、署名付きURLを使用してオブジェクトをアップロードすることはできません。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、https://oss-cn-hangzhou-internal.aliyuncs.comなどの内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、パブリックOSSエンドポイントを使用してOSSClientインスタンスを作成します。 STSから取得したカスタムドメイン名または一時的なアクセス資格情報を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。
STS を使用した一時的アクセス許可
STSを使用して、OSSへの一時アクセスを許可できます。 STSは、一時的なアクセストークンを提供するwebサービスです。 STSを使用して、管理されているサードパーティのアプリケーションまたはRAMユーザーに、カスタムの有効期間とカスタムのアクセス許可を持つ一時的なアクセス資格情報を付与できます。 STSの詳細については、「STSの概要」をご参照ください。
STSには次の利点があります。
一時的なアクセストークンを生成し、そのアクセストークンをサードパーティのアプリケーションに送信するだけで済みます。 サードパーティのアプリケーションにAccessKeyペアを提供する必要はありません。 トークンのアクセス権限と有効期間を指定できます。
トークンは、有効期間後に自動的に期限切れになります。 したがって、トークンのアクセス権限を手動で取り消す必要はありません。
STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の操作を実行します。
一時的なアクセス資格情報を取得します。
一時的なアクセス資格情報には、セキュリティトークンと、AccessKey IDとAccessKeyシークレットで構成される一時的なAccessKeyペアが含まれます。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。
次のいずれかの方法を使用して、一時的なアクセス資格情報を取得できます。
方法1:
AssumeRole操作を呼び出して、一時的なアクセス資格情報を取得します。
方法2:
STS SDKを使用して一時的なアクセス資格情報を取得します。 詳細については、「概要」をご参照ください。
STSから取得した一時的なアクセス資格情報を使用してオブジェクトをアップロードします。
com.aliyun.oss.*; impor t com.aliyun.oss.com mon.auth.*; com.aliyun.oss.mo del.GetObjectRequestをインポートします。com.aliyun.oss.mo del.PutObjectRequestをインポートします。java.io. ファイルをインポートします。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"; // オブジェクトのフルパスを指定します。 例: exampleobject.txt。 バケット名をフルパスに含めないでください。 文字列objectName = "exampleobject.txt"; // ローカルファイルのフルパスを指定します。 文字列pathName = "D :\\ localpath\\examplefile.txt"; // STSから一時的なアクセス資格情報を取得した後、そのアクセス資格情報を使用してOSSClientインスタンスを作成できます。 // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { // オブジェクトをアップロードします。 この例では、ローカルファイルがOSSにアップロードされます。 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(pathName)); ossClient.putObject(putObjectRequest); // オブジェクトをローカルファイルとしてローカルコンピュータにダウンロードします。 既存のファイルがダウンロードされたオブジェクトと同じ名前を持つ場合、既存のファイルはダウンロードされたオブジェクトによって上書きされます。 それ以外の場合、ダウンロードされたオブジェクトは保存されます。 // ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName)); } 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を生成してOSSへの一時アクセスを許可する方法の例を示します。
HTTPS経由でアクセスするための署名付きURLを生成するには、エンドポイントのプロトコルをHTTPSに設定します。
署名付きURLを生成し、一時的なアクセスのためのURLを訪問者に提供できます。 署名付きURLを生成するときに、URLの有効期間を指定して、訪問者が指定されたデータにアクセスできる期間を制限できます。
次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (+
) が含まれる場合があります。 この場合、URLのプラス記号 (+
) を % 2B
に置き換える必要があります。 そうでない場合、署名付きURLにアクセスできない可能性があります。
HTTP GETリクエストを許可する署名付きURLを生成する
次のサンプルコードは、HTTP GETリクエストを許可する署名付きURLを生成する方法の例を示しています。
com.aliyun.oss.*;
impor t com.aliyun.oss.com mon.auth.*;
impor t java.net.URL;
java.util.Dateをインポートします。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";
// オブジェクトのフルパスを指定します。 例: exampleobject.txt。 バケット名をフルパスに含めないでください。
文字列objectName = "exampleobject.txt";
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 署名付きURLの有効期間を指定します。 単位:ミリ秒。 この例では、有効期間は1時間に設定されています。
日付の有効期限=新しい日付 (new Date().getTime() + 3600 * 1000L);
// HTTP GETリクエストを許可する署名付きURLを生成します。 訪問者はブラウザにURLを入力して、指定したコンテンツにアクセスできます。
URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
System.out.println(url);
} 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();
}
}
}
}
他のHTTPリクエストメソッドを許可する署名付きURLを生成する
オブジェクトのアップロードや削除などの操作を一時的に実行することをユーザーに許可するには、特定のHTTPメソッドを使用してリクエストを許可する署名付きURLを生成する必要があります。 たとえば、HTTP PUT要求がユーザーにオブジェクトのアップロードを許可する署名付きURLを生成できます。
次のサンプルコードは、HTTP PUTリクエストを許可する署名付きURLを生成する方法の例を示しています。
com.aliyun.oss.*;
impor t com.aliyun.oss.com mon.auth.*;
impor t com.aliyun.oss.com mon.utils.HttpHeaders;
com.aliyun.oss.mo del.GeneratePresignedUrlRequestをインポートします。java.io.ByteArrayInputStreamをインポートします。impor t java.net.URL;
java.util.* をインポートします。java.util.Dateをインポートします。静的com.aliyun.oss.int ernal.OSSHeaders.OSS_USER_METADATA_PREFIXをインポートします。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";
// オブジェクトのフルパスを指定します。 例: exampleobject.txt。 バケット名をフルパスに含めないでください。
文字列objectName = "exampleobject.txt";
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
// 署名付きURLの有効期間を指定します。 単位:ミリ秒。 この例では、有効期間は1時間に設定されています。
日付の有効期限=新しい日付 (new Date().getTime() + 3600 * 1000L);
request.setExpiration(expiration);
// ContentTypeを指定します。
request.setContentType("text/plain");
// ユーザーメタデータを指定します。
request.addUserMetadata("author", "aliy");
// Generate the signed URL.
URL signedUrl = ossClient.generatePresignedUrl(request);
System.out.println(signedUrl);
Map<String, String> requestHeaders = new HashMap<String, String>();
// ContentTypeを指定します。 ContentTypeの値が、署名付きURLの生成時に指定されたコンテンツタイプと同じであることを確認します。
requestHeaders.put(HttpHeaders.CONTENT_TYPE、"text/plain");
// ユーザーメタデータを指定します。
requestHeaders.put(OSS_USER_METADATA_PREFIX + "author", "aliy");
// 署名付きURLを使用してオブジェクトをアップロードします。
ossClient.putObject(signedUrl, new ByteArrayInputStream("Hello OSS".getBytes()), -1, requestHeaders, true);
} 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を作成するときにHttpMethod.PUTパラメーターを含めると、許可された訪問者は署名付きURLを使用してオブジェクトをアップロードできます。
特定のパラメーターまたはヘッダーを含む署名付きURLを生成する
特定のパラメーターまたはヘッダーを含む署名付きURLを生成する
次のサンプルコードは、特定のパラメーターを含む署名付きURLを生成する方法の例を示しています。
com.aliyun.oss.*; impor t com.aliyun.oss.com mon.auth.*; com.aliyun.oss.mo del.GeneratePresignedUrlRequestをインポートします。impor t java.net.URL; java.util.* をインポートします。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"; // オブジェクトのフルパスを指定します。 例: exampleobject.txt。 バケット名をフルパスに含めないでください。 文字列objectName = "exampleobject.txt"; // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { // Create a request. GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName); // Set HttpMethod to PUT. generatePresignedUrlRequest.setMethod(HttpMethod.PUT); // ユーザーメタデータを指定します。 generatePresignedUrlRequest.addUserMetadata("author", "baymax"); // ContentTypeを指定します。 generatePresignedUrlRequest.setContentType("application/txt"); // 署名付きURLの有効期間を指定します。 単位:ミリ秒。 この例では、有効期間は1時間に設定されています。 日付の有効期限=新しい日付 (new Date().getTime() + 3600 * 1000L); generatePresignedUrlRequest.setExpiration(expiration); // Generate the signed URL. URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest); System.out.println(url); } 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(); } } } }
versionIdヘッダーを含む署名付きURLを生成する
次のサンプルコードは、versionIdヘッダーを含む署名付きURLを生成する方法の例を示しています。
com.aliyun.oss.*; impor t com.aliyun.oss.com mon.auth.*; com.aliyun.oss.mo del.GeneratePresignedUrlRequestをインポートします。impor t java.net.URL; java.util.* をインポートします。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"; // オブジェクトのフルパスを指定します。 例: exampleobject.txt。 バケット名をフルパスに含めないでください。 文字列objectName = "exampleobject.txt"; // オブジェクトのバージョンIDを指定します。 文字列versionId = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3 ****"; // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { // Create a request. GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName); // HttpMethodをGETに設定します。 generatePresignedUrlRequest.setMethod(HttpMethod.GET); // 署名付きURLの有効期間を指定します。 単位:ミリ秒。 この例では、有効期間は1時間に設定されています。 日付の有効期限=新しい日付 (new Date().getTime() + 3600 * 1000L); generatePresignedUrlRequest.setExpiration(expiration); // オブジェクトのバージョンIDを指定します。 Map<String, String> queryParam = new HashMap<String, String>(); queryParam.put("versionId", versionId); generatePresignedUrlRequest.setQueryParameter(queryParam); // Generate the signed URL. URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest); System.out.println(url); } 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を使用してシンプルアップロードでオブジェクトをアップロードする
次のサンプルコードでは、署名付きURLを生成し、署名付きURLを使用して単純アップロードでオブジェクトをアップロードする方法の例を示します。
説明署名付きURLを作成し、そのURLを使用してオブジェクトの単純なアップロードを許可することもできます。 署名付きURLを生成する方法の詳細については、「URL署名」をご参照ください。
com.aliyun.oss.*; impor t com.aliyun.oss.com mon.auth.*; com.aliyun.oss.int ernal.OSSHeadersをインポートします。com.aliyun.oss.mo del.GeneratePresignedUrlRequestをインポートします。com.aliyun.oss.mo del.StorageClassをインポートします。org.apache.http.HttpEntityをインポートします。org.apache.http.client.methods.CloseableHttpResponseをインポートします。org.apache.http.client.methods.HttpPutをインポートします。org.apache.http.entity.FileEntityをインポートします。org.apache.http.impl.client.CloseableHttpClientをインポートします。org.apache.http.impl.client.HttpClientsをインポートします。java.io.* をインポートします。impor t java.net.URL; java.util.* をインポートします。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"; // オブジェクトのフルパスを指定します。 例: exampleobject.txt。 バケット名をフルパスに含めないでください。 文字列objectName = "exampleobject.txt"; // アップロードするローカルファイルのフルパスを指定します。 デフォルトでは、ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからファイルがアップロードされます。 文字列pathName = "D :\\ localpath\\examplefile.txt"; // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); // リクエストヘッダーを指定します。 Map<String, String> headers = new HashMap<String, String>(); /* // オブジェクトのストレージクラスを指定します。 headers.put(OSSHeaders.STORAGE_CLASS, StorageClass.Standard.toString()); // ContentTypeを指定します。 headers.put(OSSHeaders.CONTENT_TYPE、"text/txt");* / // ユーザーメタデータを指定します。 Map<String, String> userMetadata = new HashMap<String, String>(); /* userMetadata.put("key1","value1"); userMetadata.put("key2","value2");* / URL signedUrl = null; try { // 署名付きURLの有効期間を指定します。 単位:ミリ秒。 この例では、有効期間は1時間に設定されています。 日付の有効期限=新しい日付 (new Date().getTime() + 3600 * 1000L); // Generate the signed URL. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT); // 有効期限を指定します。 request.setExpiration(expiration); // リクエストにヘッダーを追加します。 request.setHeaders (ヘッダー); // ユーザーメタデータを指定します。 request.setUserMetadata(userMetadata); // HTTP PUTリクエストを許可する署名付きURLを生成します。 signedUrl = ossClient.generatePresignedUrl (要求); // 署名されたURLを表示します。 System.out.println("signed url for putObject: " + signedUrl); } 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()); } // 署名付きURLを使用して、ユーザーにオブジェクトのアップロードを許可します。 この例では、HttpClientsが使用されます。 putObjectWithHttp(signedUrl, pathName, headers, userMetadata); } public static void putObjectWithHttp(URL signedUrl、String pathName、Map<String、String> ヘッダー、Map<String、String> userMetadata) はIOException {をスローします CloseableHttpClient httpClient = null; CloseableHttpResponse応答=null; try { HttpPut put = new HttpPut(signedUrl.toString()); HttpEntityエンティティ=new FileEntity(new File(pathName)); put.setEntity (エンティティ); // 署名付きURLの生成時にユーザーメタデータやストレージクラスなどのヘッダーを設定する場合、署名付きURLを使用してオブジェクトをアップロードするときに、これらのパラメーターをサーバーに送信する必要があります。 署名のヘッダーがサーバーに送信されたヘッダーと一致しない場合、署名エラーが報告されます。 for(Map.Entryヘッダー: headers.entrySet()){ put.addHeader(header.getKey().toString(),header.getValue().toString()); } for(Map.Entry meta: userMetadata.entrySet()){ // userMetaが使用されている場合、x-oss-metaプレフィックスがuserMetaに追加されます。 他のメソッドを使用してオブジェクトアップロード用の署名付きURLを生成する場合、x-oss-meta-プレフィックスもuserMataに追加されます。 put.addHeader("x-oss-meta-" + meta.getKey().toString(), meta.getValue().toString()); } httpClient = HttpClients.createDefault(); 応答=httpClient.exeかわいい (置く); System.out.println("Upload status code:" + response.getStatusLine().getStatusCode()); if(response.getStatusLine().getStatusCode() == 200){ System.out.println("オブジェクトはネットワークライブラリを使用してアップロードされます。"); } System.out.println(response.toString()); } catch (例外e){ e.printStackTrace(); } 最後に{ response.close(); httpClient.close(); } } }
署名付きURLを使用したマルチパートアップロードでのオブジェクトのアップロード
署名付きURLを使用して、サードパーティアプリケーションにマルチパートアップロードでラージオブジェクトのアップロードを許可する場合は、マルチパートアップロードタスクを開始し、各パートの署名付きURLを生成し、署名付きURLをサードパーティアプリケーションに提供する必要があります。 次に、サードパーティアプリケーションは、署名付きURLを使用して、オブジェクトのすべての部分をアップロードし、部分を結合することができます。
次のサンプルコードは、マルチパートアップロードで署名付きURLを生成し、署名付きURLを使用してオブジェクトをアップロードする方法の例を示しています。
com.aliyun.oss.*; impor t com.aliyun.oss.com mon.auth.*; com.aliyun.oss.mo delをインポートします。*; org.apache.http.client.methods.CloseableHttpResponseをインポートします。org.apache.http.client.methods.HttpPutをインポートします。org.apache.http.entity.InputStreamEntityをインポートします。org.apache.http.impl.client.CloseableHttpClientをインポートします。org.apache.http.impl.client.HttpClientsをインポートします。java.io.* をインポートします。impor t java.net.URL; java.util.* をインポートします。java.util.Dateをインポートします。public class SignUrlMultipart { 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"; // オブジェクトのフルパスを指定します。 例: exampleobject.txt。 バケット名をフルパスに含めないでください。 文字列objectName = "exampleobject.txt"; // アップロードするローカルファイルのフルパスを指定します。 デフォルトでは、ローカルファイルのフルパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。 文字列pathName = "D :\\ localpath\\examplefile.txt"; // 署名付きURLの有効期間を指定します。 単位:ミリ秒。 この例では、有効期間は1時間に設定されています。 長いexpireTime = 3600 * 1000L; // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); // InitiateMultipartUploadRequestオブジェクトを作成します。 InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, objectName); // マルチパートアップロードタスクを開始します。 InitiateMultipartUploadResult upResult = ossClient.initiateMultipartUpload(initRequest); // アップロードIDを取得します。 アップロードIDは、マルチパートアップロードタスクを一意に識別します。 アップロードIDを使用して、マルチパートアップロードタスクのキャンセルやクエリなどの関連操作を実行できます。 文字列uploadId = upResult.getUploadId(); // partETags is a set of PartETags. PartETagは、アップロードされたパーツのパーツ番号とETagで構成されます。 List<PartETag> partETags = new ArrayList<PartETag>(); // オブジェクトのパーツ数を計算するために使用されるパーツサイズを指定します。 単位:バイト long partSize = 1*100 * 1024L; // この例では、部品サイズは100 KBに設定されています。 // アップロードするローカルファイルのフルパスを指定します。 デフォルトでは、ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからファイルがアップロードされます。 ファイルsampleFile=新しいファイル (pathName); long fileLength = sampleFile.length(); // ローカルファイルを1つのパーツのみに分割する場合は、パーツサイズをローカルファイルのサイズに設定します。 // long fileLength = sampleFile.length(); int partCount = (int) (fileLength / partSize); if (fileLength % partSize != 0) { partCount++; } // 署名付きURLのリクエストヘッダーを指定します。 Map<String, String> headers = new HashMap<String, String>(); /* // オブジェクトのストレージクラスを指定します。 headers.put(OSSHeaders.STORAGE_CLASS, StorageClass.Standard.toString()); // ContentTypeを指定します。 headers.put(OSSHeaders.CONTENT_TYPE、"text/txt");* / // すべての部品をトラバースしてすべての署名付きURLを取得し、部品をアップロードします。 // すべての部品の署名付きURLを一度に取得してから、部品をアップロードすることもできます。 次のサンプルコードは、単一の署名付きURLを取得し、署名付きURLを使用して部品をアップロードする方法の例を示しています。 for (int i = 0; i <recordCount; i ++ ) { long startPos = i * partSize; long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize; String signUrl = getSignUrl(ossClient, bucketName, objectName, HttpMethod.PUT, expireTime, i + 1, uploadId, headers); // 署名付きURLを使用してパーツをアップロードします。 この例では、HttpClientsが使用されます。 putObjectWithHttp(signUrl、pathName、startPos、curPartSize、ヘッダー); } // 部品アップロードのシステムが部品結合のシステムと異なる場合は、部品を結合する前に部品をリストする必要があります。 // List uploaded parts. ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, objectName, uploadId); PartListing partListing = ossClient.listParts(listPartsRequest); // パーツをトラバースしてpartETagsを入力します。 for (PartSummary part : partListing.getParts()) { PartETag partETag = new PartETag(part.getPartNumber(), part.getETag()); partETags.add(partETag); } // パーツを結合します。 CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags); // 文字列md5 = BinaryUtil.toBase64String(BinaryUtil.ca lculateMd5("aaa".getBytes())); // 同じ名前の既存のオブジェクトを上書きしないように指定します。 // completeMultipartUploadRequest.addHeader("x-oss-forbid-overwrite", "true"); // 部品組み合わせのMD5チェックサム検証を指定します。 // completeMultipartUploadRequest.addHeader("Content-MD5" 、md5); // マルチパートアップロードタスクを完了します。 CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest); System.out.println("Parts is combined.") アップロードタスクが完了しました。"; // 応答でパーツのアップロード結果を返す場合は、Processをtrueに設定します。 // completeMultipartUploadRequest.setProcess("true"); // System.out.println("パーツは結合されます。 アップロードタスクが完了しました。 マルチパートアップロードステータスコード: "+ completeMultipartUploadResult.getResponse().getStatusCode(); } public static void putObjectWithHttp(String signedUrl、String pathName、long startPos、long partSize、Map<String、String> ヘッダー) はIOException {をスローします CloseableHttpClient httpClient = null; CloseableHttpResponse応答=null; try { HttpPut put = new HttpPut(signedUrl); FileInputStream inStream=新しいFileInputStream(pathName); // Skip parts that have been uploaded. inStream.skip(startPos); InputStreamEntityエンティティ=new InputStreamEntity(inStream, partSize); put.setEntity (エンティティ); // 署名付きURLの生成時にユーザーメタデータやストレージクラスなどのヘッダーを設定する場合、署名付きURLを使用してオブジェクトをアップロードするときに、これらのパラメーターをサーバーに送信する必要があります。 署名のヘッダーがサーバーに送信されたヘッダーと一致しない場合、署名エラーが報告されます。 for(Map.Entryヘッダー: headers.entrySet()){ put.addHeader(header.getKey().toString(),header.getValue().toString()); } httpClient = HttpClients.createDefault(); 応答=httpClient.exeかわいい (置く); System.out.println("Upload status code:" + response.getStatusLine().getStatusCode()); if(response.getStatusLine().getStatusCode() == 200){ System.out.println("オブジェクトはネットワークライブラリを使用してアップロードされます。"); } System.out.println(response.toString()); } catch (例外e){ e.printStackTrace(); } 最後に{ response.close(); httpClient.close(); } } public static String getSignUrl(OSS ossClient, String bucketName, String objectName, HttpMethodメソッド, long expireTime, int partNum, String uploadId, Map<String, String> headers){ // 署名付きURLの有効期間を指定します。 単位:ミリ秒。 日付の有効期限=新しい日付 (new Date().getTime() + expireTime); // Generate the signed URL. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, method); // 有効期限を指定します。 request.setExpiration(expiration); // リクエストにヘッダーを追加します。 request.setHeaders (ヘッダー); request.addQueryParameter("partNumber", String.valueOf(partNum)); request.addQueryParameter("uploadId", uploadId); // HTTPリクエストを許可する署名付きURLを生成します。 URL signedUrl = ossClient.generatePresignedUrl(request); // 署名されたURLを表示します。 System.out.println("signed url: " + signedUrl); signedUrl.toString() を返します。 } }
署名付き URL を使用してオブジェクトをダウンロード
次のサンプルコードは、署名付きURLを使用してオブジェクトをダウンロードする方法の例を示しています。
com.aliyun.oss.*; impor t com.aliyun.oss.com mon.auth.*; com.aliyun.oss.int ernal.OSSHeadersをインポートします。com.aliyun.oss.mo del.GeneratePresignedUrlRequestをインポートします。com.aliyun.oss.mo del.StorageClassをインポートします。org.apache.http.client.methods.CloseableHttpResponseをインポートします。org.apache.http.client.methods.HttpGetをインポートします。org.apache.http.impl.client.CloseableHttpClientをインポートします。org.apache.http.impl.client.HttpClientsをインポートします。java.io.* をインポートします。impor t java.net.URL; java.util.* をインポートします。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"; // オブジェクトのフルパスを指定します。 例: exampleobject.txt。 バケット名をフルパスに含めないでください。 文字列objectName = "exampleobject.txt"; // オブジェクトをダウンロードするローカルパスを指定します。 文字列pathName = "D :\\ localpath\\examplefile.txt"; // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); // リクエストヘッダーを指定します。 Map<String, String> headers = new HashMap<String, String>(); /* // オブジェクトのストレージクラスを指定します。 headers.put(OSSHeaders.STORAGE_CLASS, StorageClass.Standard.toString()); // ContentTypeを指定します。 headers.put(OSSHeaders.CONTENT_TYPE、"text/txt");* / // ユーザーメタデータを指定します。 Map<String, String> userMetadata = new HashMap<String, String>(); /* userMetadata.put("key1","value1"); userMetadata.put("key2","value2");* / URL signedUrl = null; try { // 署名付きURLの有効期間を指定します。 単位:ミリ秒。 この例では、有効期間は1時間に設定されています。 日付の有効期限=新しい日付 (new Date().getTime() + 3600 * 1000L); // 署名されたURLを生成します。 GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET); // 有効期限を指定します。 request.setExpiration(expiration); // リクエストにヘッダーを追加します。 request.setHeaders (ヘッダー); // ユーザーメタデータを指定します。 request.setUserMetadata(userMetadata); // クエリパラメーターを指定します。 // Map<String, String> queryParam = new HashMap<String, String>(); // ログのsourceIpFromSourceフィールドの値であるIPアドレスまたはCIDRブロックを指定します。 // queryParam.put("x-oss-ac-source-ip","192.0.2.0"); // サブネットマスクをバイナリに変換し、結果に1の数を入力します。 // queryParam.put("x-oss-ac-subnet-mask","32"); // 仮想プライベートクラウド (VPC) のIDを指定します。 // queryParam.put("x-oss-ac-vpc-id","vpc-12345678"); // リクエストを転送できるかどうかを指定します。 // queryParam.put("x-oss-ac-forward-allow" 、"true"); // request.setQueryParameter(queryParam); // 100 KB /秒などの単一接続帯域幅スロットリングを設定します。 単位:bit/s。 // request.setTrafficLimit(100*1024*8); // HTTP GETリクエストを許可する署名付きURLを生成します。 signedUrl = ossClient.generatePresignedUrl (要求); // 署名されたURLを表示します。 System.out.println("signed url for putObject: " + signedUrl); } 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()); } // 署名付きURLを使用してオブジェクトをダウンロードします。 この例では、HttpClientsが使用されます。 getObjectWithHttp(signedUrl, pathName, headers, userMetadata); } public static void getObjectWithHttp(URL signedUrl、String pathName、Map<String、String> ヘッダー、Map<String、String> userMetadata) はIOException {をスローします CloseableHttpClient httpClient = null; CloseableHttpResponse応答=null; try { HttpGet get = new HttpGet(signedUrl.toString()); // 署名付きURLの生成時にユーザーメタデータやストレージクラスなどのヘッダーを設定する場合は、署名付きURLを呼び出してオブジェクトをダウンロードするときに、これらのパラメーターをサーバーに送信する必要があります。 署名のヘッダーがサーバーに送信されたヘッダーと一致しない場合、署名エラーが報告されます。 for(Map.Entryヘッダー: headers.entrySet()){ get.addHeader(header.getKey().toString(),header.getValue().toString()); } for(Map.Entry meta: userMetadata.entrySet()){ // userMetaが使用されている場合、x-oss-metaプレフィックスがuserMetaに追加されます。 他のメソッドを使用してオブジェクトダウンロード用の署名付きURLを生成すると、x-oss-meta-プレフィックスもuserMataに追加されます。 get.addHeader("x-oss-meta-" + meta.getKey().toString(), meta.getValue().toString()); } httpClient = HttpClients.createDefault(); 応答=httpClient.exeかわいい (取得); System.out.println("Download status code:" + response.getStatusLine().getStatusCode()); if(response.getStatusLine().getStatusCode() == 200){ System.out.println("オブジェクトはネットワークライブラリを使用してダウンロードされます。"); } System.out.println(response.toString()); // オブジェクトをディスクに保存します。 saveFileToLocally(response.getEntity().getContent(), pathName); } catch (例外e){ e.printStackTrace(); } 最後に{ response.close(); httpClient.close(); } } public static void saveFileToLocally(InputStream inputStream, String pathName) throws IOException { DataInputStream in = null; OutputStream out = null; try { in = new DataInputStream(inputStream); out = new DataOutputStream(new FileOutputStream(pathName)); int bytes = 0; byte[] bufferOut = new byte[1024]; while (((bytes = in.read(bufferOut))) ! = -1) { out.write(bufferOut, 0, bytes); } } catch (例外e){ e.printStackTrace(); } 最後に{ in.close(); out.close(); } } }
よくある質問
署名付きURLを使用してファイルをアップロードする場合、アップロード中に署名付きURLの有効期限が切れた場合、ファイルはアップロードされますか?
シンプルアップロードを使用すると、アップロード中に署名付きURLの有効期限が切れても、ファイルは引き続きアップロードされます。
マルチパートアップロードを使用する場合、パーツの署名付きURLがアップロード中に期限切れになると、残りのパーツがアップロードされないことがあります。