O download de objetos grandes pode falhar quando a rede está instável ou outras exceções ocorrem. Em alguns casos, a falha persiste mesmo após várias tentativas. Para resolver esse problema, o Object Storage Service (OSS) oferece o recurso de download resumível. Nesse tipo de download, o OSS divide o objeto em várias partes e baixa cada uma separadamente. Após o download de todas as partes, o OSS as combina em um objeto completo.
Observações
Este tópico usa o endpoint público da região China (Hangzhou). Para acessar o OSS a partir de outros serviços Alibaba Cloud na mesma região, use um endpoint interno. Para mais informações sobre regiões e endpoints do OSS, consulte Regions and endpoints.
Este tópico demonstra como criar uma instância OSSClient com um endpoint do OSS. Para configurações alternativas, como usar um domínio personalizado ou autenticar com credenciais do Security Token Service (STS), consulte Create an OssClient instance.
Para usar o download resumível, você precisa da permissão
oss:GetObject. Para mais informações, consulte Grant a custom policy.
Método de implementação
Use o método OssClient.ResumableDownloadObject para executar um download resumível. O DownloadObjectRequest desse método inclui os seguintes parâmetros:
|
Parâmetro |
Descrição |
Obrigatório |
Valor padrão |
Como definir |
|
bucket |
Nome do bucket. |
Sim |
Nenhum |
Defina no construtor. |
|
key |
Caminho completo do arquivo no OSS. |
Sim |
Nenhum |
Defina no construtor. |
|
filePath |
Caminho completo do arquivo local. |
Não |
Nome do arquivo no OSS |
Defina no construtor. |
|
partSize |
Tamanho do fragmento. O valor deve estar entre 100 KB e 5 GB. |
Não |
8 MB |
Configure por meio de setPartSize. |
|
threadNum |
Número de downloads simultâneos de fragmentos. |
Não |
3 |
Informe no construtor ou por meio de setThreadNum. |
|
checkpointDir |
Arquivo que registra os resultados do download local dos fragmentos. Defina este parâmetro para ativar o recurso de download resumível. As informações de progresso são salvas nesse arquivo durante o download. Se o download de um fragmento falhar, a próxima tentativa será retomada a partir do ponto registrado no arquivo. Após a conclusão do download, esse arquivo é excluído. |
Não |
Mesma pasta do arquivo de download. |
Informe no construtor ou por meio de setCheckpointDir. |
Exemplo de código
O código a seguir mostra como executar um download resumível:
#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, if the bucket is in the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Set yourRegion to the Region ID of the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the Region ID to cn-hangzhou. */
std::string Region = "yourRegion";
/* Specify the bucket name, for example, examplebucket. */
std::string BucketName = "examplebucket";
/* Specify the full path of the object. The full path cannot contain the bucket name. For example, exampledir/exampleobject.txt. */
std::string ObjectName = "exampledir/exampleobject.txt";
/* Download the object to a local file named examplefile.txt and save it to the specified local path (D:\\localpath). If the local file exists, it is overwritten. If it does not exist, it is created. */
/* If you do not specify a local path, the downloaded file is saved to the local path of the project by default. */
std::string DownloadFilePath = "D:\\localpath\\examplefile.txt";
/* Set the folder for the breakpoint record file and make sure the specified folder exists, for example, D:\\localpath. */
/* If an object download is interrupted and a breakpoint record file is generated, you must set the corresponding breakpoint record file to resume the download. After the download is complete, this file is deleted. */
std::string CheckpointFilePath = "D:\\localpath";
/* Initialize network resources. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Obtain access credentials from environment variables. Before you run this code sample, 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);
/* Perform a resumable download. */
DownloadObjectRequest request(BucketName, ObjectName, DownloadFilePath, CheckpointFilePath);
auto outcome = client.ResumableDownloadObject(request);
if (!outcome.isSuccess()) {
/* Handle exceptions. */
std::cout << "ResumableDownloadObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Release network resources. */
ShutdownSdk();
return 0;
}
Referências
Para obter o código de exemplo completo de downloads resumíveis, acesse GitHub sample.
Para mais informações sobre a operação de API para downloads resumíveis, consulte GetObject.