OSS里的文件怎么全部解凍?
如果未開啟歸檔直讀,歸檔類型的Object需要解凍后才能讀取。OSS控制臺暫不支持批量解凍某個目錄下的文件,解凍時需要逐個找到并執(zhí)行解凍,為減少操作步驟,可以使用其他方式批量對文件進行解凍操作。本文將介紹批量解凍OSS文件的具體方法。
解決方案
要批量解凍OSS里的文件,您需要按照以下步驟操作:
1.在批量解凍文件之前,您首先需要列舉出所有文件。
列舉文件推進您使用存儲空間清單功能,它可以方便且高效的列舉bucket文件,尤其是在海量Object的列舉場景中,具體操作,請參見存儲空間清單。
除此之外,您也可以通過使用阿云SDK調(diào)用ListObjects的方法來實現(xiàn)相關(guān)操作,但是相較使用存儲清單來說產(chǎn)生費用會更多,具體信息,請參見列舉文件和請求費用。
2.篩選清單返回結(jié)果字段中StorageClass類型為歸檔的文件,并記錄這些文件不包含bucket名稱在內(nèi)的完整路徑。
如果您使用的是阿里云SDK方式獲取列表,例如返回清單中單條數(shù)據(jù)定義為"s",獲取參數(shù)Key及StorageClass,以便篩選名稱+狀態(tài)信息,過濾出目標文件路徑清單。參考如下
System.out.println("fileurl"+s.getKey()+"&stu:"+s.getStorageClass());
3.使用對應(yīng)的文件路徑進行批量解凍。你可按照個人技術(shù)棧需求下面3種批量處理方式,具體操作,請參見解凍文件。
命令行工具ossutil:整體來看,相較其他兩種方式來說操作更加簡潔且效率相對較高;缺點是需要了解命令行操作。文中以Linux系統(tǒng)為示例,推薦您在熟悉命令行工具及Linux系統(tǒng)操作時使用。
使用REST API:由于沒有批量解凍的接口,使用REST API發(fā)送解凍請求時只能挨個文件執(zhí)行調(diào)用,直接發(fā)起REST API請求需要手動編寫代碼計算簽名,推薦對程序自定義要求較高時使用。
阿里云SDK:操作相對ossutil來說較為繁瑣,但通用性較強,缺點是要使用編譯工具在本機上運行,且需要有一定的代碼閱讀和修改的能力。本文提供了Java示例,如需查看,請查閱下方示例。
補充說明
如果您需要使用阿里云SDK批量解凍文件,需要對示例代碼進行部分修改,由于示例代碼只展示單文件解凍操作的相關(guān)流程,在需要批量解凍時,首先將過濾出需要解凍的文件的路徑信息放入一個清單中,用清單替換示例中的objectName參數(shù),之后遞歸進行解凍文件操作即可,具體可參考如下示例:
此示例僅展示Java語言批量解凍歸檔文件相關(guān)操作,如需查看文檔解凍是否完成,請參見如何查看OSS文件解凍是否完成?
如果您需要解凍冷歸檔、深度冷歸檔類型的文件,請?zhí)D(zhuǎn)至SDK簡介,根據(jù)需要使用的編程語言,查詢對應(yīng)語言的解凍文件文檔內(nèi)容。
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";
// 從環(huán)境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫B(tài)ucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 創(chuàng)建清單,并添加不包含Bucket名稱在內(nèi)的歸檔類型Object的完整路徑。
List<String> filePaths = new ArrayList<>();
filePaths.add("filePath1");
filePaths.add("filePath2");
// 創(chuàng)建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();
}
}
}
}