このトピックでは、オブジェクトの名前を変更する方法について説明します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。
バケットの階層名前空間機能が有効になっている場合は、名前の変更操作を呼び出して、バケット内のオブジェクトの名前を変更できます。
バケットの階層名前空間機能を有効にする方法の詳細については、「バケットの作成」をご参照ください。
バケットの階層名前空間機能が有効になっていない場合、バケット内のオブジェクトの名前を直接変更することはできません。 バケット内のオブジェクトの名前を変更するには、CopyObject操作を呼び出してソースオブジェクトをコピーし、新しいオブジェクトの名前を変更します。 次に、DeleteObject操作を呼び出して、ソースオブジェクトを削除します。
サンプルコード
次のサンプルコードは、examplebucketバケット内のsrcobject.txtという名前のオブジェクトの名前をdestobject.txtに変更する方法の例を示しています。
階層名前空間機能が有効になっているバケット内のオブジェクトの名前を変更する
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.RenameObjectRequestをインポートします。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(); // バケットの名前を指定します。 String bucketName = "examplebucket"; // ソースオブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 文字列sourceObject = "srcobject.txt"; // ソースオブジェクトと同じバケット内の宛先オブジェクトの絶対パスを設定します。 バケット名をフルパスに含めないでください。 文字列destinationObject = "destobject.txt"; // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { // バケット内のソースオブジェクトの絶対パスを宛先オブジェクトの絶対パスに変更します。 RenameObjectRequest renameObjectRequest = new RenameObjectRequest(bucketName, sourceObject, destinationObject); ossClient.renameObject(renameObjectRequest); } 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.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*; com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。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(); // バケットの名前を指定します。 String bucketName = "examplebucket"; // ソースオブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 文字列sourceKey = "srcobject.txt"; // 宛先オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 文字列destinationKey = "destobject.txt"; // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { // examplebucketバケット内のsrcobject.txtオブジェクトを同じバケット内のdestobject.txtオブジェクトにコピーします。 ossClient.copyObject(bucketName, sourceKey, bucketName, destinationKey); // srcobject.txtオブジェクトを削除します。 ossClient.de leteObject(bucketName, sourceKey); } 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(); } } } }
説明バケット内のディレクトリの名前も直接変更できません。 バケット内のディレクトリの名前を変更するには、上記の例に従って、ディレクトリ内のサブディレクトリとオブジェクトの名前を1つずつ変更します。
参考資料
オブジェクトの名前を変更するために呼び出すAPI操作の詳細については、「CopyObject」および「DeleteObject」をご参照ください。
APIの名前変更操作の詳細については、「名前変更」をご参照ください。