Debe restaurar los objetos Archive o Cold Archive antes de leerlos. En este tema se describe cómo restaurar objetos Archive y Cold Archive.
Notas
Solo los objetos Archive y Cold Archive admiten el método RestoreObject.
En este tema se utiliza el endpoint público de la región China (Hangzhou). Si desea acceder a OSS desde otros servicios de Alibaba Cloud en la misma región que OSS, use un endpoint interno. Para obtener más información sobre las regiones y los endpoints de OSS, consulte Regions and endpoints.
En este tema se muestra cómo crear una instancia de OSSClient con un endpoint de OSS. Para conocer configuraciones alternativas, como usar un dominio personalizado o autenticarse con credenciales de Security Token Service (STS), consulte Create an OssClient instance.
Para restaurar un objeto, debe contar con el permiso
oss:RestoreObject. Para obtener más información, consulte Grant custom access policies to a RAM user.
Restaurar un objeto Archive
A continuación se muestra el código para restaurar un objeto Archive:
#include <alibabacloud/oss/OssClient.h>
#include <thread>
#include <chrono>
#include <algorithm>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize OSS account information. */
/* Set yourEndpoint to the Endpoint of the region where the bucket is located. For example, for the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set yourRegion to the region where the bucket is located. For example, for the China (Hangzhou) region, set the Region to cn-hangzhou. */
std::string Region = "yourRegion";
/* Set BucketName to the name of your bucket, for example, examplebucket. */
std::string BucketName = "examplebucket";
/* Set ObjectName to the full path of the Archive object. The path does not include the bucket name. */
std::string ObjectName = "yourObjectName";
/* Initialize network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run this code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Restore the Archive object. */
auto outcome = client.RestoreObject(BucketName, ObjectName);
/* Objects that are not in the Archive storage class cannot be restored. */
if (!outcome.isSuccess()) {
/* Handle exceptions. */
std::cout << "RestoreObject fail, code: " << outcome.error().Code() <<
", message: " << outcome.error().Message() <<
", requestId: " << outcome.error().RequestId() << std::endl;
return -1;
}
std::string onGoingRestore("ongoing-request=\"false\"");
int maxWaitTimeInSeconds = 600;
while (maxWaitTimeInSeconds > 0)
{
auto meta = client.HeadObject(BucketName, ObjectName);
std::string restoreStatus = meta.result().HttpMetaData()["x-oss-restore"];
std::transform(restoreStatus.begin(), restoreStatus.end(), restoreStatus.begin(), ::tolower);
if (!restoreStatus.empty() &&
restoreStatus.compare(0, onGoingRestore.size(), onGoingRestore)==0) {
std::cout << " success, restore status:" << restoreStatus << std::endl;
/* The Archive object is successfully restored. */
break;
}
std::cout << " info, WaitTime:" << maxWaitTimeInSeconds
<< "; restore status:" << restoreStatus << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(10));
maxWaitTimeInSeconds--;
}
if (maxWaitTimeInSeconds == 0)
{
std::cout << "RestoreObject fail, TimeoutException" << std::endl;
}
/* Release network resources. */
ShutdownSdk();
return 0;
}
Restaurar un objeto Cold Archive
A continuación se muestra el código para restaurar un objeto Cold Archive:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize OSS account information. */
/* Set yourEndpoint to the Endpoint of the region where the bucket is located. For example, for the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set yourRegion to the region where the bucket is located. For example, for the China (Hangzhou) region, set the Region to cn-hangzhou. */
std::string Region = "yourRegion";
/* Set BucketName to the name of your bucket, for example, examplebucket. */
std::string BucketName = "examplebucket";
/* Set ObjectName to the full path of the Cold Archive object. The path does not include the bucket name. */
std::string ObjectName = "yourObjectName";
/* Initialize network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run this code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* To specify the storage class as Cold Archive when you upload a file, see the following code. */
//auto content = std::make_shared<std::stringstream>("test");
//PutObjectRequest putRequest(BucketName, ObjectName, content);
//putRequest.MetaData().addHeader("x-oss-storage-class", "ColdArchive");
//auto putOutcome = client.PutObject(putRequest);
RestoreObjectRequest request(BucketName, ObjectName);
/* Set the number of days that the object remains in the restored state. The default value is 1. */
request.setDays(2);
/* Set the restoration priority for the Cold Archive object. TierType::Bulk indicates that the restoration is complete within 5 to 12 hours. */
request.setTierType(TierType::Bulk);
auto outcome = client.RestoreObject(request);
if (!outcome.isSuccess()) {
/* Handle exceptions. */
std::cout << "Delete Bucket Inventory fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
}
/* Release network resources. */
ShutdownSdk();
return 0;
}
Referencias
Para consultar el código de ejemplo completo que muestra cómo restaurar objetos Archive y Cold Archive, consulte el ejemplo en GitHub.
Para obtener más información sobre la operación de API que permite restaurar objetos, consulte RestoreObject.