OSS提供标准、低频访问、归档和冷归档四种存储类型,全面覆盖从热到冷的各种数据存储场景。本文主要介绍如何转换文件(Object)的存储类型。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心
  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见新建OSSClient
  • 要转换文件存储类型,您必须具有oss:GetObjectoss:PutObjectoss:RestoreObject权限。具体操作,请参见为RAM用户授权自定义的权限策略

示例代码

以下提供了详细的示例代码用于Object存储类型的相互转换。
  • 以下代码用于将Object的存储类型从标准或低频访问转换为归档类型:
    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    import com.aliyun.oss.model.CopyObjectRequest;
    import com.aliyun.oss.model.CopyObjectResult;
    import com.aliyun.oss.model.ObjectMetadata;
    import com.aliyun.oss.model.StorageClass;
    
    public class Demo {
        public static void main(String[] args) throws Exception {
            // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
            String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
            String accessKeyId = "yourAccessKeyId";
            String accessKeySecret = "yourAccessKeySecret";
            // 本示例中的Bucket与Object需提前创建好, 且Object类型为标准或低频访问存储类型。
            // 填写Bucket名称,例如examplebucket。
            String bucketName = "examplebucket";
            // 填写不包含Bucket名称在内的Object完整路径,例如exampleobject.txt。
            String objectName = "exampleobject.txt";
    
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            try {
                // 创建CopyObjectRequest对象。
                CopyObjectRequest request = new CopyObjectRequest(bucketName, objectName, bucketName, objectName) ;
    
                // 创建ObjectMetadata对象。
                ObjectMetadata objectMetadata = new ObjectMetadata();
    
                // 封装header,此处以设置存储类型为归档类型为例。
                objectMetadata.setHeader("x-oss-storage-class", StorageClass.Archive);
                request.setNewObjectMetadata(objectMetadata);
    
                // 更改文件存储类型。
                CopyObjectResult result = ossClient.copyObject(request);
            } 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();
                }
            }
        }
    }
  • 以下代码用于将Object的存储类型从归档转换为低频访问类型:
    package com.aliyun.oss.demo;
    
    import com.aliyun.oss.ClientException;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.OSSException;
    import com.aliyun.oss.model.CopyObjectRequest;
    import com.aliyun.oss.model.CopyObjectResult;
    import com.aliyun.oss.model.ObjectMetadata;
    import com.aliyun.oss.model.StorageClass;
    
    public class Demo {
        public static void main(String[] args) throws Exception {
            // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
            String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
            String accessKeyId = "yourAccessKeyId";
            String accessKeySecret = "yourAccessKeySecret";
            // 本示例中的Bucket与Object需提前创建好, 且Object类型为归档存储类型。
            // 填写Bucket名称,例如examplebucket。
            String bucketName = "examplebucket";
            // 填写不包含Bucket名称在内的Object完整路径,例如exampleobject.txt。
            String objectName = "exampleobject.txt";
    
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            try {
                // 获取文件元信息。
                ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucketName, objectName);
    
                // 检查目标文件是否为归档类型。如果是,则需要先解冻才能更改存储类型。
                StorageClass storageClass = objectMetadata.getObjectStorageClass();
                System.out.println("storage type:" + storageClass);
                if (storageClass == StorageClass.Archive) {
                    // 解冻文件。
                    ossClient.restoreObject(bucketName, objectName);
    
                    // 等待解冻完成。
                    do {
                        Thread.sleep(1000);
                        objectMetadata = ossClient.getObjectMetadata(bucketName, objectName);
                    } while (!objectMetadata.isRestoreCompleted());
                }
    
                // 创建CopyObjectRequest对象。
                CopyObjectRequest request = new CopyObjectRequest(bucketName, objectName, bucketName, objectName) ;
    
                // 创建ObjectMetadata对象。
                objectMetadata = new ObjectMetadata();
    
                // 封装header,此处以设置存储类型为低频访问类型为例。
                objectMetadata.setHeader("x-oss-storage-class", StorageClass.IA);
                request.setNewObjectMetadata(objectMetadata);
    
                // 更改文件存储类型。
                CopyObjectResult result = ossClient.copyObject(request);
    
            } 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();
                }
            }
        }
    }

相关文档

  • 关于转换文件存储类型的完整示例代码,请参见GitHub示例
  • 关于转换文件存储类型的API接口说明,请参见CopyObject