AppendObject操作を呼び出して、既存の追加可能オブジェクトにコンテンツを追加できます。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。
追加アップロードを使用するには、
oss:PutObject
権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。コンテンツを追加するオブジェクトが存在しない場合、AppendObject操作を呼び出すと追加可能なオブジェクトが作成されます。
コンテンツを追加するオブジェクトが存在する場合:
オブジェクトが追加可能なオブジェクトであり、追加操作が開始される指定された位置が現在のオブジェクトサイズに等しい場合、データはオブジェクトの最後に追加されます。
オブジェクトが追加可能オブジェクトであり、追加操作の開始位置が現在のオブジェクトサイズと等しくない場合、PositionNotEqualToLengthエラーが返されます。
オブジェクトが追加可能オブジェクトでない場合、ObjectNotAppendableエラーが返されます。
CopyObject操作は、追加可能なオブジェクトでは実行できません。
例
次のサンプルコードは、追加アップロード操作を実行する方法の例を示しています。
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.AppendObjectRequestをインポートします。com.aliyun.oss.mo del.AppendObjectResultをインポートします。com.aliyun.oss.mo del.ObjectMetadataをインポートします。java.io.ByteArrayInputStreamをインポートします。public classデモ {
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";
String content1 = "Hello OSS A \n";
String content2 = "Hello OSS B \n";
String content3 = "Hello OSS C \n";
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
ObjectMetadata meta = new ObjectMetadata();
// アップロードするコンテンツの種類を指定します。
meta.setContentType("text/plain");
// オブジェクトのwebページのキャッシュ動作を指定します。
// meta.setCacheControl("no-cache");
// オブジェクトのダウンロード時にオブジェクトの名前を指定します。
// meta.setContentDisposition("attachment;filename=oss_download.txt");
// オブジェクトのコンテンツのエンコード形式を指定します。
// meta.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
// 受信したメッセージの内容が送信したメッセージの内容と同じかどうかを確認するためのリクエストヘッダーを指定します。
// meta.setContentMD5("ohhnqLBJFiKkPSBO1eNaUA==");
// 有効期限を指定します。
// try {
// meta.setExpirationTime(DateUtil.parseRfc822Date("Wed、08 Jul 2022 16:57:01 GMT"));
//} catch (ParseException e) {
// e.printStackTrace();
//}
// サーバー側の暗号化方法を指定します。 この例では、メソッドはSSE-OSSに設定されています。
// meta.setServerSideEncryption(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
// オブジェクトのACLを指定します。 この例では、オブジェクトのACLはprivateに設定されています。
// meta.setObjectAcl(CannedAccessControlList.Private);
// オブジェクトのストレージクラスを指定します。
// meta.setHeader(OSSHeaders.OSS_STORAGE_CLASS、StorageClass.Standard);
// AppendObject操作を呼び出して追加可能なオブジェクトを作成するときに、名前の先頭にx-oss-meta-* が付いたパラメーターを追加できます。 既存の追加可能オブジェクトにコンテンツを追加する場合、これらのパラメーターをリクエストに含めることはできません。 名前の先頭にx-oss-meta-* が付いているパラメータは、オブジェクトのメタデータと見なされます。
// meta.setHeader("x-oss-meta-author" 、"Alice");
// AppendObjectRequestを使用して複数のパラメーターを設定します。
AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucketName, objectName, new ByteArrayInputStream(content1.getBytes()),meta);
// AppendObjectRequestを使用して単一のパラメーターを設定します。
// バケットの名前を指定します。
// appendObjectRequest.setBucketName(bucketName);
// オブジェクトの名前を指定します。
// appendObjectRequest.setKey(objectName);
// 追加するコンテンツを指定します。 InputStreamとFileの2種類のコンテンツがサポートされています。 この例では、コンテンツはInputStreamに設定されています。
//appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
// 追加するコンテンツを指定します。 InputStreamとFileの2種類のコンテンツがサポートされています。 この例では、コンテンツは [ファイル] に設定されています。
// appendObjectRequest.setFile (新しいファイル ("D :\\ localpath\\examplefile.txt"));
// オブジェクトメタデータを指定します。 オブジェクトに対して最初の追加操作を実行する場合にのみ、オブジェクトのメタデータを指定できます。
//appendObjectRequest.setMetadata(meta);
// 最初の追加操作を実行します。
// 追加操作の開始位置を指定します。
appendObjectRequest.setPosition(0L);
AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
// オブジェクトのCRC-64値を計算します。 The value is calculated based on the ECMA-182 standard.
System.out.println(appendObjectResult.getObjectCRC());
// Start the second append.
// NextPositionは、オブジェクトの長さである、次の追加操作の開始位置を指定します。
appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes()));
appendObjectResult = ossClient.appendObject(appendObjectRequest);
// 3番目の追加操作を実行します。
appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
appendObjectRequest.setInputStream(new ByteArrayInputStream(content3.getBytes()));
appendObjectResult = ossClient.appendObject(appendObjectRequest);
} 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をご参照ください。
追加アップロードのAPI操作の詳細については、「AppendObject」をご参照ください。