edit-icon download-icon

オブジェクト

最終更新日: May 05, 2018

オブジェクトはユーザー操作の基本的な OSS データユニットです。1 つのオブジェクトの最大サイズは、データアップロードモードによって異なります。オブジェクトのサイズは、Put Object モードでは 5 GB 以下、マルチパートアップロードモードでは 48.8 TB 以下の制限があります。オブジェクトには、key、meta、および data が含まれます。key はオブジェクト名です。meta は、オブジェクトの説明で、名前と値の一連のペアで構成されます。data はオブジェクトデータです。

命名規則

オブジェクト命名規則:

  • UTF-8 エンコーディングを使用します。
  • 長さは 1 ~ 1023 バイトでなければなりません。
  • “/“ または “\” で開始することはできません。
  • “\r” または “\n” の改行を含めることはできません。

オブジェクトのアップロード

最も簡単なアップロード

コードは次のとおりです。

  1. public void putObject(String bucketName, String key, String filePath) throws FileNotFoundException {
  2. // Initializes an OSSClient
  3. OSSClient client = ...;
  4. // Retrieves specified file input stream
  5. File file = new File(filePath);
  6. InputStream content = new FileInputStream(file);
  7. // Creates Metadata for the object to upload
  8. ObjectMetadata meta = new ObjectMetadata();
  9. // You must set the ContentLength
  10. meta.setContentLength(file.length());
  11. // Uploads the object
  12. PutObjectResult result = client.putObject(bucketName, key, content, meta);
  13. // Prints the ETag
  14. System.out.println(result.getETag());
  15. }

オブジェクトは InputStream フォームで OSS にアップロードされます。上記の例では、オブジェクトをアップロードするたびに、このオブジェクトに関連付けられている ObjectMetadata を指定する必要があることがわかります。ObjectMetaData はユーザーによるオブジェクトの説明で、名前と値の一連のペアで構成されています。ここでは、アップロードされるオブジェクトのサイズを SDK が正確に識別できるように ContentLength が必要です。サーバーにアップロードされるファイルとローカルファイル間の整合性を確保するために、ContentMD5 を設定できます。OSS ではアップロードデータの MD5 値が計算され、ユーザーがアップロードした MD5 値と比較されます。それらの値が一致しない場合、InvalidDigest エラーコードが返されます。

シミュレーションフォルダーの作成

OSS サービスでは、フォルダーを使用しません。すべての要素はオブジェクトとして格納されます。ただし、次のコードを使用してシミュレーションフォルダーを作成できます。

  1. String bucketName = "your-bucket-name";
  2. //The name of the folder to be created, which must satisfy the object naming rules and end with "/"
  3. String objectName = "folder_name/";
  4. OSSClient client = new OSSClient(OSS_ENDPOINT, ACCESS_ID, ACCESS_KEY);
  5. ObjectMetadata objectMeta = new ObjectMetadata();
  6. /*Here, the size is 0. 注意 that OSS does not use folders. Instead, you can simulate a folder using an object with a size of 0, but the dataStream may still have data
  7. */
  8. byte[] buffer = new byte[0];
  9. ByteArrayInputStream in = new ByteArrayInputStream(buffer);
  10. objectMeta.setContentLength(0);
  11. try {
  12. client.putObject(bucketName, objectName, in, objectMeta);
  13. } finally {
  14. in.close();
  15. }

OSS コンソールでシミュレーションフォルダーを作成するには、サイズが 0 のオブジェクトを作成します。このオブジェクトはアップロードおよびダウンロードできます。コンソールには、”/“ で終わるオブジェクトがフォルダーとして表示されるため、 この方法でシミュレーションフォルダーを作成できます。フォルダーにアクセスする場合は、「フォルダーシミュレーション機能」を参照してください。

オブジェクトの Http ヘッダーの設定

OSS サービスを使用すると、オブジェクトの Http ヘッダーをカスタマイズできます。次のコードでは、オブジェクトの有効期限を設定しています。

  1. // Initializes an OSSClient
  2. OSSClient client = ...;
  3. // Initializes the upload input stream
  4. InputStream content = ...;
  5. // Creates Metadata for the object to upload
  6. ObjectMetadata meta = new ObjectMetadata();
  7. // Sets the ContentLength to 1000
  8. meta.setContentLength(1000);
  9. // Sets the object to expire after 1 hour
  10. Date expire = new Date(new Date().getTime() + 3600 * 1000);
  11. meta.setExpirationTime(expire);
  12. client.putObject(bucketName, key, content, meta);

Java SDK は、Cache-Control、Content-Disposition、Content-Encoding、および Expires の 4 つの種類の HTTP ヘッダーをサポートします。ヘッダーの詳細については、『RFC2616』を参照してください。

ユーザー定義メタデータ

OSS では、ユーザーがオブジェクトを表すメタデータを定義できます。例:

  1. // Sets the custom metadata name value as my-data
  2. meta.addUserMetadata("name", "my-data");
  3. // Uploads the object
  4. client.putObject(bucketName, key, content, meta);

上記のコードでは、名前が “name” で値が “my-data” のメタデータを定義しています。このオブジェクトをダウンロードする場合、ユーザーはメタデータも取得します。1 つのオブジェクトに対して同様のパラメーターを複数設定することはできますが、すべてのユーザーメタの合計サイズは 2 KB 以下にする必要があります。

注意: ユーザーメタの名前では大文字小文字は区別されません。たとえば、ユーザーがオブジェクトをアップロードし、メタデータの名前を “Name” と定義すると、ヘッダーに格納されているパラメーターが “x-oss-meta-name” になります。したがって、オブジェクトにアクセスするときは、”name” という名前のパラメーターを使用します。ただし、格納されているパラメーターが “name” である場合、そのパラメーターの情報が見つからず、システムは “Null” を返します。

チャンク形式エンコーディングによるアップロード

アップロードされるコンテンツの長さが不明である場合 (たとえば、Socket が終了するまでにアップロードするために、SocketStream の受信とアップロードがデータソースと同時に行われる場合)、チャンク形式エンコーディングが適用されます。

チャンク形式では、次のエンコーディング方法が採用されます。

  1. Chunked-Body = *chunk
  2. "0" CRLF
  3. footer
  4. CRLF
  5. chunk = chunk-size [chunk-ext] CRLF
  6. chunk-data CRLF
  7. hex-no-zero = <HEX excluding "0">
  8. chunk-size = hex-no-zero * HEX
  9. chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-value ] )
  10. chunk-ext-name = token
  11. chunk-ext-val = token | quoted-string
  12. chunk-data = chunk-size(OCTET)
  13. footer = *entity-header

コードには複数のチャンクが含まれており、長さ 0 でマークされるチャンクで終了します。各チャンクは 2 つの部分から構成されます。最初の部分はチャンクの長さと長さの単位を示します (通常は指定されません)。2 番目の部分には、指定された長さのコンテンツが含まれます。各部分は CRLF によって分けられます。長さ 0 の最後のチャンクにはフッターと呼ばれるものが含まれますが、これは空白のヘッダーです。

putobject チャンク形式エンコーディングObjectMetadata インスタンスで ContentLength 属性を明示的に設定する場合、通常のアップロード方法が適用されます (リクエスト本文の長さは Content-Length リクエストヘッダーによって決まります)。それ以外の場合は、チャンク形式エンコーディング方法が適用されます。

  1. OSSClient client = new OSSClient(endpoint, accessId, accessKey);
  2. FileInputStream fin = new FileInputStream(new File(filePath));
  3. // If content-length is not specified, chunked encoding is the default value.
  4. PutObjectResult result = client.putObject(bucketName, key, fin, new ObjectMetadata());

Append Object

OSS では、ユーザーが Append Object メソッドを使用して、オブジェクトの最後にコンテンツを直接付加することができます。この操作を実行するには、オブジェクトタイプが Appendable である必要があります。作成したオブジェクトタイプが追加可能オブジェクトである場合は Append Object 操作を使用し、標準オブジェクトの場合は Put Object アップロードメソッドを使用します。

  1. // Creates an OSSClient instance
  2. OSSClient client = new OSSClient(ENDPOINT, ACCESS_ID, ACCESS_KEY);
  3. // Initiates the first Append Object request; note that the first append operation requires the append location to be set to 0
  4. final String fileToAppend = "<file to append at first time>";
  5. AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucketName, key, new File(fileToAppend));
  6. // Sets content-type; note that you can only set object meta for objects created using Append
  7. ObjectMetadata meta = new ObjectMetadata();
  8. meta.setContentType("image/jpeg");
  9. appendObjectRequest.setMetadata(meta);
  10. // Sets the append location to 0 and sends the Append Object request
  11. appendObjectRequest.setPosition(0L);
  12. AppendObjectResult appendObjectResult = client.appendObject(appendObjectRequest);
  13. // Initiates the second Append Object request. The append location is set to the object length after the first append
  14. final String fileToAppend2 = "<file to append at second time>";
  15. appendObjectRequest = new AppendObjectRequest(bucketName, key, new File(fileToAppend2));
  16. // Sets the append location as the size of the previously appended file and sends the Append object request
  17. appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
  18. appendObjectResult = client.appendObject(appendObjectRequest);
  19. OSSObject o = client.getObject(bucketName, key);
  20. // The current size of this object is the total size of the two previously appended files
  21. System.out.println(o.getObjectMetadata().getContentLength());
  22. // The next append location is the total size of the two previously appended files
  23. System.err.println(appendObjectResult.getNextPosition().longValue());

Append アップロードメソッドを使用する場合、Position パラメーターを正しく設定する必要があります。ユーザーが追加可能オブジェクトを作成する場合、追加位置は 0 です。追加可能オブジェクトにコンテンツを追加する場合、追加位置はオブジェクトの現在の長さです。オブジェクト長を取得する方法は 2 つあり、1 つは追加アップロードに続いて返されるコンテンツから取得する方法です (上記のコードを参照)。もう 1 つの方法は、次に説明するように、getObjectMetadata 操作を使用してオブジェクトの現在の長さを取得する方法です。

注意:オブジェクトのメタ設定が適用されるのは、オブジェクトの作成に Append Object が使用されるときのみです。これによって、次に説明するように、コピーオブジェクトインターフェイスを使用してオブジェクトのメタを変更できます (送信元と送信先に同じオブジェクトが設定されます)。

マルチパートアップロード

OSS では、サーバーにアップロードする 1 つのオブジェクトを複数のリクエストに分割できます。ブロックアップロードコンテンツについては、「MultipartUpload」の「マルチパートアップロード」を参照してください。

バケットオブジェクトの一覧表示

オブジェクトのリスト

  1. public void listObjects(String bucketName) {
  2. // Initializes an OSSClient
  3. OSSClient client = ...;
  4. // Retrieves information for all objects in the specified bucket
  5. ObjectListing listing = client.listObjects(bucketName);
  6. // Traverses all objects
  7. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  8. System.out.println(objectSummary.getKey());
  9. }
  10. }

listObjects メソッドは ObjectListing オブジェクトを返します。このオブジェクトにはこの listObject リクエストに対して返された結果が含まれます。ここでは、ObjectListing で getObjectSummaries メソッドを使用してすべてのオブジェクト記述情報を取得できます (List<OSSObjectSummary>)。

注意:: デフォルトでは、バケットに 100 を超えるオブジェクトが含まれている場合、最初の 100 個のみが返され、返される結果の IsTruncated パラメーターは true になります。返される NextMarker は、次のデータアクセスの開始点として使用できます。返されるオブジェクトエントリの数は、MaxKeys パラメーターを変更するか、別のアクセスで Marker パラメーターを使用することで増やすことができます。

拡張パラメーター

一般に、ListObjectsRequest パラメーターはさらに強力な機能を提供します。例:

  1. // Constructs the ListObjectsRequest request
  2. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  3. // Sets parameters
  4. listObjectsRequest.setDelimiter("/");
  5. listObjectsRequest.setMarker("123");
  6. ...
  7. ObjectListing listing = client.listObjects(listObjectsRequest);

上記のコードでは、リクエストを完了するために listObjects オーバーロードメソッドを呼び出し、受信した ListObjectsRequest を使用しました。ListObjectsRequest でパラメーターを設定すると、多くの拡張機能が使用できるようになります。次の表では、ListObjectsRequest パラメーターの名前と操作を示します。

名前 機能
Delimiter オブジェクト名の文字をグループ化するために使用されます。指定されたプレフィックスが名前に含まれる、最初の Delimiter 文字間にあるすべてのオブジェクトは、要素のグループ (CommonPrefixes) として使用されます。
Marker アルファベット順で marker 後の最初のエントリから結果を返すように設定します。
MaxKeys 1 件のリクエストに対して返されるオブジェクトの最大数を制限します。指定されていない場合のデフォルト値は 100 です。MaxKeys の値は 1000 以下にする必要があります。
Prefix 返されるオブジェクトキーにプレフィックスが付いていることを要求します。プレフィックスを使用するクエリから返されるキーにはそのプレフィックスも含まれることに注意してください。

全体で 1,000 を超える一連のオブジェクトをトラバースするためには複数のイテレーションを実行する必要があります。各イテレーション中に、最後のイテレーションの最終的なオブジェクトキーを現在のイテレーションの Marker として使用できます。

フォルダー機能のシミュレーション

Delimiter と Prefix を組み合わせて、フォルダー機能をシミュレートできます。Delimiter と Prefix を組み合わせる目的は次のとおりです。フォルダーの名前として Prefix を設定すると、そのプレフィックスで始まるファイルが列挙されて、そのフォルダーのすべてのファイルとサブフォルダーが再帰的に返されます。Delimiter を “/“ に設定すると、返される値にはフォルダー内のファイルが列挙され、サブフォルダーは CommonPrefixes セクションで返されます。サブフォルダー内のファイルとフォルダーは再帰的に表示されません。バケットに oss.jpg、fun/test.jpg、fun/movie/001.avi、fun/movie/007.avi の 4 つのファイルが含まれる場合、 フォルダーの区切り記号として “/“ 記号を使用します。

すべてのバケットファイルのリスト

バケット内のすべてのファイルを取得するには、次のように記述します。

  1. // Constructs the ListObjectsRequest request
  2. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  3. // List Objects
  4. ObjectListing listing = client.listObjects(listObjectsRequest);
  5. // Traverses all objects
  6. System.out.println("Objects:");
  7. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  8. System.out.println(objectSummary.getKey());
  9. }
  10. // Traverse all CommonPrefix
  11. System.out.println("CommonPrefixs:");
  12. for (String commonPrefix : listing.getCommonPrefixes()) {
  13. System.out.println(commonPrefix);
  14. }

出力:

  1. Objects:
  2. fun/movie/001.avi
  3. fun/movie/007.avi
  4. fun/test.jpg
  5. oss.jpg
  6. CommonPrefixs:

ディレクトリ内のすべてのファイルの再帰的なリスト

Prefix パラメーターを次のように設定して、ディレクトリ内のすべてのファイルを取得できます。

  1. // Constructs the ListObjectsRequest request
  2. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  3. // Recursively lists all files in the fun directory
  4. listObjectsRequest.setPrefix("fun/");
  5. ObjectListing listing = client.listObjects(listObjectsRequest);
  6. // Traverses all objects
  7. System.out.println("Objects:");
  8. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  9. System.out.println(objectSummary.getKey());
  10. }
  11. // Traverse all CommonPrefix
  12. System.out.println("\nCommonPrefixs:");
  13. for (String commonPrefix : listing.getCommonPrefixes()) {
  14. System.out.println(commonPrefix);
  15. }

出力:

  1. Objects:
  2. fun/movie/001.avi
  3. fun/movie/007.avi
  4. fun/test.jpg
  5. CommonPrefixs:

ディレクトリ内のファイルとサブディレクトリのリスト

Prefix と Delimiter を組み合わせて使用して、ディレクトリ内のファイルとサブディレクトリをリストできます。

  1. // Constructs the ListObjectsRequest request
  2. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
  3. // "/" is the folder separator
  4. listObjectsRequest.setDelimiter("/");
  5. // Lists all files and folders in the fun directory
  6. listObjectsRequest.setPrefix("fun/");
  7. ObjectListing listing = client.listObjects(listObjectsRequest);
  8. // Traverses all objects
  9. System.out.println("Objects:");
  10. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  11. System.out.println(objectSummary.getKey());
  12. }
  13. // Traverse all CommonPrefix
  14. System.out.println("\nCommonPrefixs:");
  15. for (String commonPrefix : listing.getCommonPrefixes()) {
  16. System.out.println(commonPrefix);
  17. }

出力:

  1. Objects:
  2. fun/test.jpg
  3. CommonPrefixs:
  4. fun/movie/

返される結果の、ObjectSummaries リストに fun ディレクトリ内のファイルが含まれます。CommonPrefixs リストには fun ディレクトリのすべてのサブフォルダーが示されます。fun/movie/001.avi および fun/movie/007.avi ファイルは fun フォルダーの movie ディレクトリにあるため、リストされていません。

オブジェクトの取得

オブジェクトの単純な取得

次のコードを使用してオブジェクトを取得し、ストリームに入力することができます。

  1. public void getObject(String bucketName, String key) throws IOException {
  2. // Initializes an OSSClient
  3. OSSClient client = ...;
  4. // Retrieves an object; the returned result is an OSSObject object
  5. OSSObject object = client.getObject(bucketName, key);
  6. // Retrieves ObjectMeta
  7. ObjectMetadata meta = object.getObjectMetadata();
  8. // Retrieves an object input stream
  9. InputStream objectContent = object.getObjectContent();
  10. // Processes the object
  11. ...
  12. // Closes the stream
  13. objectContent.close();
  14. }

OSSObject には、オブジェクトのバケット、オブジェクト名、メタデータ、入力ストリームなどさまざまなオブジェクト情報が含まれます。入力ストリームを使用すると、オブジェクトの内容を取得してオブジェクトまたはメモリに格納できます。ObjectMetadata には、オブジェクトのアップロード時に定義された ETag、Http ヘッダー、カスタムメタデータが含まれます。

GetObjectRequest を使用したオブジェクトの取得

他の関数については、GetObjectRequest を使用してオブジェクトを取得できます。

  1. // Initializes an OSSClient
  2. OSSClient client = ...;
  3. // Creates GetObjectRequest
  4. GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
  5. // Retrieves 0-100 bytes of data
  6. getObjectRequest.setRange(0, 100);
  7. // Retrieves an object; the returned result is an OSSObject object
  8. OSSObject object = client.getObject(getObjectRequest);

getObjectRequest で setRange メソッドを使用してオブジェクトの範囲を返すことができます。マルチパートダウンロードと再開可能なデータ転送にこの関数を使用できます。GetObjectRequest は次のパラメーターを設定できます。

パラメーター 説明
Range ファイル転送の範囲を指定します。
ModifiedSinceConstraint 指定された時間が実際の変更時間よりも早い場合、ファイルは通常どおり送信されます。それ以外の場合は、304 Not Modified 例外がスローされます。
UnmodifiedSinceConstraint 指定された時間が実際の変更時間と同じかそれ以降である場合、ファイルは通常どおり送信されます。それ以外の場合は、412 Precondition Failed 例外がスローされます。
MatchingETagConstraints ETag グループを入力します。入力した予測 ETag がオブジェクトの ETag と一致する場合、ファイルは通常どおり送信されます。それ以外の場合、412 Precondition Failed 例外がスローされます。
NonmatchingEtagConstraints ETag グループを入力します。入力した予測 ETag がオブジェクトの ETag と一致しない場合、ファイルは通常どおり送信されます。それ以外の場合、304 Not Modified 例外がスローされます。
ResponseHeaderOverrides OSS から返されるリクエストの一部のヘッダーをカスタマイズします。

ResponseHeaderOverrides は、OSS によって返されるヘッダーをカスタマイズする、一連の変更可能なパラメーターを提供します。これを次の表に示します。

パラメーター 説明
ContentType OSS はリクエストされた content-type ヘッダーを返します。
ContentLanguage OSS はリクエストされた content-language ヘッダーを返します。
Expires OSS はリクエストされた expires ヘッダーを返します。
CacheControl OSS はリクエストされた cache-control ヘッダーを返します。
ContentDisposition OSS はリクエストされた content-disposition ヘッダーを返します。
ContentEncoding OSS はリクエストされた content-encoding ヘッダーを返します。

ファイルへのオブジェクトの直接ダウンロード

次のコードを使用して、指定したファイルにオブジェクトを直接ダウンロードできます。

  1. // Creates GetObjectRequest
  2. GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
  3. // Downloads the object to the file
  4. ObjectMetadata objectMetadata = client.getObject(getObjectRequest, new File("/path/to/file"));

上記のメソッドを使用してファイルにオブジェクトをダウンロードする場合、ObjectMetadata オブジェクトが返されます。

ObjectMetadata のみの取得

getObjectMetadata メソッドは、オブジェクトエンティティの代わりに ObjectMetadata のみを取得するために使用できます。コードは次のとおりです。

  1. ObjectMetadata objectMetadata = client.getObjectMetadata(bucketName, key);

オブジェクトの削除

次のコードでオブジェクトは削除されます。

  1. public void deleteObject(String bucketName, String key) {
  2. // Initializes an OSSClient
  3. OSSClient client = ...;
  4. // Deletes the object
  5. client.deleteObject(bucketName, key);
  6. }

オブジェクトのコピー

1 つのオブジェクトのコピー

copyObject メソッドを使用すると、1 つのオブジェクトをコピーできます。コードは次のとおりです。

  1. public void copyObject(String srcBucketName, String srcKey, String destBucketName, String destKey) {
  2. // Initializes an OSSClient
  3. OSSClient client = ...;
  4. // Copies the object
  5. CopyObjectResult result = client.copyObject(srcBucketName, srcKey, destBucketName, destKey);
  6. // Prints the results
  7. System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
  8. }

copyObject は 1 つの CopyObjectResult オブジェクトを返します。これには、新しいオブジェクトの ETag と変更時間が含まれます。このメソッドを使用してコピーされるオブジェクトは 1 GB 未満である必要があります。1 GB 超えた場合、エラーが報告されます。オブジェクトが 1 GB を超える場合は、次の Upload Part Copy メソッドを使用します。

CopyObjectRequest を使用したオブジェクトのコピー

CopyObjectRequest を使用して、次のようにオブジェクトをコピーすることができます。

  1. // Initializes an OSSClient
  2. OSSClient client = ...;
  3. // Creates a CopyObjectRequest object
  4. CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcKey, destBucketName, destKey);
  5. // Sets new metadata
  6. ObjectMetadata meta = new ObjectMetadata();
  7. meta.setContentType("text/html");
  8. copyObjectRequest.setNewObjectMetadata(meta);
  9. // Copies the object
  10. CopyObjectResult result = client.copyObject(copyObjectRequest);
  11. System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());

CopyObjectRequest によってコピー先オブジェクトの ObjectMeta を変更できます。この方法によって、ModifiedSinceConstraint、UnmodifiedSinceConstraint、MatchingETagConstraints、および NonmatchingEtagConstraints が提供されます。これらのパラメーターは、GetObjectRequest のパラメーターと同様に使用されます。詳細については、GetObjectRequest のパラメーターを参照してください。

注意: データをコピーすると、既存のオブジェクトのメタ情報が変更される可能性があります。コピーされたソースオブジェクトのアドレスがコピー先オブジェクトのアドレスと同じ場合、x-oss-metadata-directive の値に関係なく、ソースオブジェクトのメタ情報が置き換えられます。

POST メソッドのファイルアップロード

フロンドエンドに Policy および Signature フォームフィールドを提供するにはバックエンドサービスが必要です。

POST ポリシーの生成

リクエストの有効性を検証するには、POST によってリクエストされる policy フォームフィールドを使用します。UTF-8 および base64 でエンコードされる JSON テキストメッセージのように、ポリシーは POST リクエストが満たす必要のある条件を示します。 公開読み書きバケットをアップロードする場合、POST フォームフィールドはオプションですが、このフィールドを使用して POST リクエストを制限することを強くお勧めします。ポリシー JSON 文字列の生成ルールの詳細については、API ドキュメント「Post Object」の「Post Policy」を参照してください。

次にポリシー文字列の設定の例を示します。

  1. {"expiration":"2015-02-25T14:25:46.000Z",
  2. "conditions":[
  3. {"bucket":"oss-test2"},
  4. ["eq","$key","user/eric/${filename}"],
  5. ["starts-with","$key","user/eric"],
  6. ["starts-with","$x-oss-meta-tag","dummy_etag"],
  7. ["content-length-range",1,1024]
  8. ]
  9. }

上記の JSON 文字列を生成するには、次のコードを使用できます。

  1. OSSClient client = new OSSClient(endpoint, accessId, accessKey);
  2. Date expiration = DateUtil.parseIso8601Date("2015-02-25T14:25:46.000Z");
  3. PolicyConditions policyConds = new PolicyConditions();
  4. policyConds.addConditionItem("bucket", bucketName);
  5. // The exact match condition "$" must be followed by braces
  6. policyConds.addConditionItem(MatchMode.Exact, PolicyConditions.COND_KEY, "user/eric/\\${filename}");
  7. // Adds a prefix match condition
  8. policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, "user/eric");
  9. policyConds.addConditionItem(MatchMode.StartWith, "x-oss-meta-tag", "dummy_etag");
  10. // Adds a range match condition
  11. policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 1, 1024);
  12. // Generates the Post Policy string
  13. String postPolicy = client.generatePostPolicy(expiration, policyConds);
  14. System.out.println(postPolicy);
  15. // Calculates the policy's Base64 encoding
  16. byte[] binaryData = postPolicy.getBytes("utf-8");
  17. String encodedPolicy = BinaryUtil.toBase64String(binaryData);
  18. System.out.println(encodedPolicy);

ポリシー文字列の生成後は、POST フォームフィールド内のポリシーが Base64 エンコーディングに基づいている必要があることに注意してください。

Post Signature の生成

さらに、POST アップロードの場合は、リクエストの有効性を検証するために Post Signature を生成する必要があります。次のコードを参照してください。

  1. //Imports the original Post Policy json string to generate the postSignature
  2. String postSignature = client.calculatePostSignature(postPolicy);
  3. System.out.println(postSignature);