You need to enable JavaScript to run this app.
导航

移动及重命名场景(Java SDK)

最近更新时间2024.02.04 18:31:02

首次发布时间2023.01.19 14:37:16

TOS 不支持直接对对象重命名。如果您需要在桶(Bucket)中对文件进行重命名,您可以通过 Java SDK 的 copyObject 接口将源对象拷贝至目标对象,然后通过 deleteObject 接口删除源对象。

重命名单个对象

以下代码展示如何将桶 bucket-example 中的对象 src-object 重命名为 dest-object

import com.volcengine.tos.TOSV2;
import com.volcengine.tos.TOSV2ClientBuilder;
import com.volcengine.tos.TosClientException;
import com.volcengine.tos.TosServerException;
import com.volcengine.tos.model.object.CopyObjectV2Input;
import com.volcengine.tos.model.object.CopyObjectV2Output;
import com.volcengine.tos.model.object.DeleteObjectInput;

public class RenameObjectExample {
    public static void main(String[] args) {
        String endpoint = "your endpoint";
        String region = "your region";
        String accessKey = System.getenv("TOS_ACCESS_KEY");
        String secretKey = System.getenv("TOS_SECRET_KEY");

        // 源桶名
        String srcBucketName = "src-bucket-example";
        // 源对象名,需保证对象存在,否则报404
        String srcObjectKey = "src_example_dir/example_object.txt";
        // 目的桶名
        String bucketName = "bucket-example";
        // 目的对象名,如果目的对象存在,默认会将其覆盖
        String objectKey = "dst_example_dir/example_object.txt";

        TOSV2 tos = new TOSV2ClientBuilder().build(region, endpoint, accessKey, secretKey);

        try{
            CopyObjectV2Input input = new CopyObjectV2Input().setBucket(bucketName).setKey(objectKey)
                    .setSrcBucket(srcBucketName).setSrcKey(srcObjectKey);
//            // 如果需要设置目的对象的 ACL/storageClass 等元数据,或指定拷贝时元数据的继承/重写方式,可参考以下代码
//            ObjectMetaRequestOptions options = new ObjectMetaRequestOptions();
//            // 指定 ACL 为 private
//            options.setAclType(ACLType.ACL_PRIVATE);
//            // 指定 storageClass 为标准存储
//            options.setStorageClass(StorageClassType.STORAGE_CLASS_STANDARD);
//            input.setOptions(options);
//            // 指定限定条件,源对象的 ETag 与指定的 ETag 匹配时才拷贝,
//            // 指定的 ETag 可通过 headObject 获取,此处的 "XXX" 仅为示例,请使用正确的 ETag
//            input.setCopySourceIfMatch("XXX");
//            // 默认情况下目的对象的元数据,除了 ACL 之外,全部继承自源对象的元数据
//            // 可通过以下设置,指定拷贝时重写对象元数据,不继承源对象的元数据。
//            input.setMetadataDirective(MetadataDirectiveType.METADATA_DIRECTIVE_REPLACE);
            CopyObjectV2Output output = tos.copyObject(input);
            System.out.println("copyObject succeed, object's etag is " + output.getEtag());
            System.out.println("copyObject succeed, object's crc64 is " + output.getHashCrc64ecma());

            // 删除源数据
            tos.deleteObject(new DeleteObjectInput().setBucket(srcBucketName).setKey(srcObjectKey));
        } catch (TosClientException e) {
            // 操作失败,捕获客户端异常,一般情况是请求参数错误,此时请求并未发送
            System.out.println("rename Object failed");
            System.out.println("Message: " + e.getMessage());
            if (e.getCause() != null) {
                e.getCause().printStackTrace();
            }
        } catch (TosServerException e) {
            // 操作失败,捕获服务端异常,可以获取到从服务端返回的详细错误信息
            System.out.println("rename Object failed");
            System.out.println("StatusCode: " + e.getStatusCode());
            System.out.println("Code: " + e.getCode());
            System.out.println("Message: " + e.getMessage());
            System.out.println("RequestID: " + e.getRequestID());
        } catch (Throwable t) {
            // 作为兜底捕获其他异常,一般不会执行到这里
            System.out.println("rename Object failed");
            System.out.println("unexpected exception, message: " + t.getMessage());
        }
    }
}

重命名目录

以下代码展示如何将桶 bucket-example 中目录 example_dir1/ 重命名为 example_dir2/

import com.volcengine.tos.TOSV2;
import com.volcengine.tos.TOSV2ClientBuilder;
import com.volcengine.tos.TosClientException;
import com.volcengine.tos.TosServerException;
import com.volcengine.tos.model.object.*;

public class RenameDirExample {
    public static void main(String[] args) {
        String endpoint = "your endpoint";
        String region = "your region";
        String accessKey = System.getenv("TOS_ACCESS_KEY");
        String secretKey = System.getenv("TOS_SECRET_KEY");

        // 源桶名
        String srcBucketName = "src-bucket-example";
        // 源目录
        String srcDir = "src_example_dir/";
        // 目的桶名
        String bucketName = "bucket-example";
        // 目的目录
        String dstDir = "dst_example_dir/";

        TOSV2 tos = new TOSV2ClientBuilder().build(region, endpoint, accessKey, secretKey);

        try{
            boolean isTruncated = true;
            String continuationToken = null;
            while (isTruncated) {
                ListObjectsType2Input input = new ListObjectsType2Input().setBucket(bucketName)
                        .setContinuationToken(continuationToken).setPrefix(srcDir);
                ListObjectsType2Output output = tos.listObjectsType2(input);
                System.out.printf("listObjectsType2 succeed, is truncated? %b, next continuation token is %s.\n",
                        output.isTruncated(), output.getNextContinuationToken());
                if (output.getContents() != null) {
                    for (int i = 0; i < output.getContents().size(); i++) {
                        ListedObjectV2 object = output.getContents().get(i);
                        // 重命名为 dstDir 目录下的文件
                        String dstKey = dstDir + object.getKey().substring(srcDir.length());
                        CopyObjectV2Input copy = new CopyObjectV2Input().setBucket(bucketName).setKey(dstKey)
                                .setSrcBucket(srcBucketName).setSrcKey(object.getKey());
//            // 如果需要设置目的对象的 ACL/storageClass 等元数据,或指定拷贝时元数据的继承/重写方式,可参考以下代码
//            ObjectMetaRequestOptions options = new ObjectMetaRequestOptions();
//            // 指定 ACL 为 private
//            options.setAclType(ACLType.ACL_PRIVATE);
//            // 指定 storageClass 为标准存储
//            options.setStorageClass(StorageClassType.STORAGE_CLASS_STANDARD);
//            input.setOptions(options);
//            // 指定限定条件,源对象的 ETag 与指定的 ETag 匹配时才拷贝,
//            // 指定的 ETag 可通过 headObject 获取,此处的 "XXX" 仅为示例,请使用正确的 ETag
//            input.setCopySourceIfMatch("XXX");
//            // 默认情况下目的对象的元数据,除了 ACL 之外,全部继承自源对象的元数据
//            // 可通过以下设置,指定拷贝时重写对象元数据,不继承源对象的元数据。
//            input.setMetadataDirective(MetadataDirectiveType.METADATA_DIRECTIVE_REPLACE);
                        CopyObjectV2Output copyOutput = tos.copyObject(copy);
                        System.out.println("copyObject succeed, object's etag is " + copyOutput.getEtag());
                        System.out.println("copyObject succeed, object's crc64 is " + copyOutput.getHashCrc64ecma());

                        // 删除源数据
                        tos.deleteObject(new DeleteObjectInput().setBucket(srcBucketName).setKey(object.getKey()));
                        System.out.println("rename object in " + srcDir + ", from " + object.getKey() + " to " + dstKey);
                    }
                }
                isTruncated = output.isTruncated();
                continuationToken = output.getNextContinuationToken();
            }

        } catch (TosClientException e) {
            // 操作失败,捕获客户端异常,一般情况是请求参数错误,此时请求并未发送
            System.out.println("rename Object failed");
            System.out.println("Message: " + e.getMessage());
            if (e.getCause() != null) {
                e.getCause().printStackTrace();
            }
        } catch (TosServerException e) {
            // 操作失败,捕获服务端异常,可以获取到从服务端返回的详细错误信息
            System.out.println("rename Object failed");
            System.out.println("StatusCode: " + e.getStatusCode());
            System.out.println("Code: " + e.getCode());
            System.out.println("Message: " + e.getMessage());
            System.out.println("RequestID: " + e.getRequestID());
        } catch (Throwable t) {
            // 作为兜底捕获其他异常,一般不会执行到这里
            System.out.println("rename Object failed");
            System.out.println("unexpected exception, message: " + t.getMessage());
        }
    }
}

相关文档

  • 关于拷贝对象 API 文档,请参见 CopyObject
  • 关于删除对象 API 文档,请参见 DeleteObject