全部产品
Search
文档中心

对象存储 OSS:OSS里的文件怎么全部解冻?

更新时间:Apr 22, 2024

如果未开启归档直读,归档类型的Object需要解冻后才能读取。OSS控制台暂不支持批量解冻某个目录下的文件,解冻时需要逐个找到并执行解冻,为减少操作步骤,可以使用其他方式批量对文件进行解冻操作。本文将介绍批量解冻OSS文件的具体方法。

解决方案

要批量解冻OSS里的文件,您需要按照以下步骤操作:

1.在批量解冻文件之前,您首先需要列举出所有文件。

  • 列举文件推进您使用存储空间清单功能,它可以方便且高效的列举bucket文件,尤其是在海量Object的列举场景中,具体操作,请参见存储空间清单

  • 除此之外,您也可以通过使用阿云SDK调用ListObjects的方法来实现相关操作,但是相较使用存储清单来说产生费用会更多,具体信息,请参见列举文件请求费用

2.筛选清单返回结果字段中StorageClass类型为归档的文件,并记录这些文件不包含bucket名称在内的完整路径。

说明

如果您使用的是阿里云SDK方式获取列表,例如返回清单中单条数据定义为"s",获取参数Key及StorageClass,以便筛选名称+状态信息,过滤出目标文件路径清单。参考如下

System.out.println("fileurl"+s.getKey()+"&stu:"+s.getStorageClass());

3.使用对应的文件路径进行批量解冻。你可按照个人技术栈需求下面3种批量处理方式,具体操作,请参见解冻文件

  • 命令行工具ossutil:整体来看,相较其他两种方式来说操作更加简洁且效率相对较高;缺点是需要了解命令行操作。文中以Linux系统为示例,推荐您在熟悉命令行工具及Linux系统操作时使用。

  • 使用REST API:由于没有批量解冻的接口,使用REST API发送解冻请求时只能挨个文件执行调用,直接发起REST API请求需要手动编写代码计算签名,推荐对程序自定义要求较高时使用。

  • 阿里云SDK:操作相对ossutil来说较为繁琐,但通用性较强,缺点是要使用编译工具在本机上运行,且需要有一定的代码阅读和修改的能力。本文提供了Java示例,如需查看,请查阅下方示例。

Java示例

补充说明

如果您需要使用阿里云SDK批量解冻文件,需要对示例代码进行部分修改,由于示例代码只展示单文件解冻操作的相关流程,在需要批量解冻时,首先将过滤出需要解冻的文件的路径信息放入一个清单中,用清单替换示例中的objectName参数,之后递归进行解冻文件操作即可,具体可参考如下示例:

说明

此示例仅展示Java语言批量解冻归档文件相关操作,如需查看文档解冻是否完成,请参见如何查看OSS文件解冻是否完成?

如果您需要解冻冷归档、深度冷归档类型的文件,请跳转至SDK简介,根据需要使用的编程语言,查询对应语言的解冻文件文档内容。

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.*;

import java.util.ArrayList;
import java.util.List;

public class Demo {
    public static void main(String[] args) throws Exception {
        // Endpoint以华北2(北京)为例,其它Region请按实际情况填写。
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 创建清单,并添加不包含Bucket名称在内的归档类型Object的完整路径。
        List<String> filePaths = new ArrayList<>();
        filePaths.add("filePath1");
        filePaths.add("filePath2");

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            for (String filePath : filePaths) {
                ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucketName, filePath);
                // 校验Object是否为归档类型Object。
                StorageClass storageClass = objectMetadata.getObjectStorageClass();
                if (storageClass == StorageClass.Archive) {
                    // 解冻Object。
                    ossClient.restoreObject(bucketName, filePath);
                }
                System.out.println(filePath+" start thawing.");
            }
        } 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();
            }
        }
    }
}

相关文档