Le téléchargement de fichiers volumineux peut échouer en raison d'une instabilité du réseau ou d'autres exceptions. Dans ce cas, le téléchargement risque de ne pas aboutir, même après plusieurs tentatives. OSS propose une fonctionnalité de téléchargement avec reprise pour résoudre ce problème.
Notes
Cette rubrique utilise l'endpoint public de la région Chine (Hangzhou). Si vous souhaitez accéder à OSS depuis d'autres services Alibaba Cloud situés dans la même région que votre bucket OSS, utilisez un endpoint interne. Pour plus d'informations sur les régions et les endpoints OSS, consultez Régions et endpoints.
-
Les exemples de cette rubrique montrent comment créer une instance OSSClient à l'aide d'un nom de domaine OSS. Pour créer une instance OSSClient via un nom de domaine personnalisé ou le Security Token Service (STS), reportez-vous à la section Initialisation (C SDK).
RemarquePour effectuer un téléchargement avec reprise via STS, assurez-vous d'utiliser la version 3.5.2 ou ultérieure du C SDK.
L'utilisation du téléchargement avec reprise nécessite l'autorisation
oss:GetObject. Pour plus d'informations, consultez la page Accorder une politique personnalisée.
Exemple de code
Utilisez la structure oss_resumable_clt_params_t pour effectuer un téléchargement avec reprise. La structure oss_resumable_clt_params_t comprend les paramètres suivants :
|
Paramètre |
Description |
|
thread_num |
Nombre de threads simultanés. La valeur par défaut est 1. |
|
enable_checkpoint |
Indique si le téléchargement avec reprise est activé. Par défaut, cette fonctionnalité est désactivée. |
|
partSize |
Taille des parties. La valeur doit être comprise entre 1 o et 5 Go. L'unité est l'octet. |
|
checkpoint_path |
Chemin d'accès au fichier de point de contrôle. Le chemin par défaut est le dossier |
Pendant le téléchargement, les informations de progression sont enregistrées dans un fichier checkpoint. En cas d'échec du téléchargement, la tentative suivante lit le fichier checkpoint pour reprendre le téléchargement. Une fois le téléchargement terminé, le fichier checkpoint est supprimé.
Le code suivant montre comment effectuer un téléchargement avec reprise.
#include "oss_api.h"
#include "aos_http_io.h"
/* Replace yourEndpoint with 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. */
const char *endpoint = "yourEndpoint";
/* Replace with your bucket name, for example, examplebucket. */
const char *bucket_name = "examplebucket";
/* Specify the full path of the object. The full path cannot contain the bucket name. For example, exampledir/exampleobject.txt. */
const char *object_name = "exampledir/exampleobject.txt";
/* Specify the full path of the local file. */
const char *local_filename = "yourLocalFilename";
/* Replace yourRegion with the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* Initialize the aos_string_t type with a char* string. */
aos_str_set(&options->config->endpoint, endpoint);
/* Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. */
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
// You must also configure the following two parameters.
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* Specify whether a CNAME is used. A value of 0 indicates that no CNAME is used. */
options->config->is_cname = 0;
/* Set network parameters, such as the timeout period. */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* Call the aos_http_io_initialize method at the program entry to initialize global resources such as the network and memory. */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* A memory pool (pool) for memory management, which is equivalent to apr_pool_t. The implementation code is in the apr library. */
aos_pool_t *pool;
/* Create a new memory pool. The second parameter is NULL, which indicates that the new pool does not inherit from another memory pool. */
aos_pool_create(&pool, NULL);
/* Create and initialize options. This parameter includes global configuration information such as endpoint, access_key_id, access_key_secret, is_cname, and curl. */
oss_request_options_t *oss_client_options;
/* Allocate memory for options in the memory pool. */
oss_client_options = oss_request_options_create(pool);
/* Initialize the client options oss_client_options. */
init_options(oss_client_options);
/* Initialize parameters. */
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
oss_resumable_clt_params_t *clt_params;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
/* Perform a resumable download. */
clt_params = oss_create_resumable_clt_params_content(pool, 1024 * 100, 3, AOS_TRUE, NULL);
resp_status = oss_resumable_download_file(oss_client_options, &bucket, &object, &file, headers, NULL, clt_params, NULL, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("download succeeded\n");
} else {
printf("download failed\n");
}
/* Release the memory pool. This is equivalent to releasing the memory allocated for various resources during the request. */
aos_pool_destroy(pool);
/* Release the previously allocated global resources. */
aos_http_io_deinitialize();
return 0;
}
Références
Pour obtenir l'exemple de code complet relatif au téléchargement avec reprise, consultez l'exemple GitHub.
Pour plus d'informations sur l'opération API associée au téléchargement avec reprise, consultez GetObject.