このトピックでは、ファイル (オブジェクト) の名前を変更する方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「一般的なシナリオの設定例」をご参照ください。
バケットで階層型名前空間機能が有効になっている場合、Rename 操作を呼び出してオブジェクトの名前を直接変更できます。
バケットで階層型名前空間機能を有効にする方法の詳細については、「バケットの作成 (Java SDK V1)」をご参照ください。
バケットで階層型名前空間機能が有効になっていない場合、OSS ではオブジェクトの名前を直接変更することはできません。同じバケット内のオブジェクトの名前を変更するには、CopyObject 操作を呼び出してソースオブジェクトをコピー先オブジェクトにコピーしてから、DeleteObject 操作を呼び出してソースオブジェクトを削除します。
サンプルコード
次のコードは、examplebucket バケット内の srcobject.txt ファイルの名前を destobject.txt に変更する方法を示しています。
名前変更の例 (バケットで階層型名前空間が有効な場合)
import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.RenameObjectRequest; public class Demo { 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"; // ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。 String sourceObject = "srcobject.txt"; // ソースオブジェクトと同じバケット内の宛先オブジェクトの絶対パスを指定します。絶対パスにバケット名を含めることはできません。 String destinationObject = "destobject.txt"; // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 String region = "cn-hangzhou"; // OSSClient インスタンスを作成します。 // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // バケット内のソースオブジェクトの絶対パスを宛先オブジェクトの絶対パスに変更します。 RenameObjectRequest renameObjectRequest = new RenameObjectRequest(bucketName, sourceObject, destinationObject); ossClient.renameObject(renameObjectRequest); } 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.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; public class Demo { 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"; // ソースオブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。 String sourceKey = "srcobject.txt"; // 宛先オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。 String destinationKey = "destobject.txt"; // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 String region = "cn-hangzhou"; // OSSClient インスタンスを作成します。 // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // examplebucket バケットから srcobject.txt を同じバケット内の destobject.txt にコピーします。 ossClient.copyObject(bucketName, sourceKey, bucketName, destinationKey); // srcobject.txt を削除します。 ossClient.deleteObject(bucketName, sourceKey); } 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(); } } } }説明OSS はフォルダの直接的な名前変更をサポートしていません。フォルダの名前を変更するには、上記の例で示した方法を使用して、フォルダ内の各サブディレクトリとオブジェクトの名前を個別に変更する必要があります。
関連ドキュメント
ファイル名の変更に使用される API 操作の詳細については、「CopyObject」および「DeleteObject」をご参照ください。
名前変更 API 操作の詳細については、「Rename」をご参照ください。