Transférez des annuaires vers et depuis Amazon S3 à l'aide de la AWS SDK pour PHP version 3 - AWS SDK pour PHP

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Transférez des annuaires vers et depuis Amazon S3 à l'aide de la AWS SDK pour PHP version 3

Dans la AWS SDK pour PHP version 3, vous utilisez la Transfer classe pour charger des répertoires entiers dans un compartiment Amazon S3 et télécharger des compartiments entiers dans un répertoire local.

Téléchargement d'un répertoire local sur Amazon S3

L'Aws\S3\Transferobjet effectue les transferts. L'exemple suivant montre comment charger de manière récursive un répertoire local de fichiers dans un compartiment Amazon S3.

// Create an S3 client. $client = new \Aws\S3\S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', ]); // Where the files will be sourced from. $source = '/path/to/source/files'; // Where the files will be transferred to. $dest = 's3://bucket'; // Create a transfer object. $directoryTransfer = new \Aws\S3\Transfer($client, $source, $dest); // Perform the transfer synchronously. $directoryTransfer->transfer();

Dans cet exemple, nous avons créé un client Amazon S3, créé un Transfer objet et effectué le transfert de manière synchrone.

L'exemple précédent montre la quantité minimale de code nécessaire pour effectuer un transfert. Un Transfer objet peut également effectuer des transferts de manière asynchrone et possède différentes options de configuration que vous pouvez utiliser pour personnaliser les transferts.

Vous pouvez télécharger les fichiers locaux dans un « sous-dossier » d'un compartiment Amazon S3 en fournissant un préfixe de clé dans s3:// l'URI. L'exemple suivant télécharge les fichiers locaux sur le disque pour le compartiment bucket et stocke les fichiers sous le préfixe de clé foo.

$source = '/path/to/source/files'; $dest = 's3://bucket/foo'; $directoryTransfer = new \Aws\S3\Transfer($client, $source, $dest); $directoryTransfer->transfer();

Téléchargement d'un compartiment Amazon S3

Vous pouvez télécharger de manière récursive un compartiment Amazon S3 vers un répertoire local sur disque en spécifiant l'$sourceargument sous forme d'URI Amazon S3 (par exemple,s3://bucket) et l'$destargument comme chemin d'accès à un répertoire local.

// Where the files will be sourced from. $source = 's3://bucket'; // Where the files will be transferred to. $dest = '/path/to/destination/dir'; $directoryTransfer = new \Aws\S3\Transfer($client, $source, $dest); $directoryTransfer->transfer();
Note

Le SDK crée automatiquement tous les répertoires nécessaires lors du téléchargement des objets du compartiment.

Vous pouvez inclure un préfixe de clé dans l'URI Amazon S3 après le compartiment pour télécharger uniquement les objets stockés dans un « pseudo-dossier ». L'exemple suivant télécharge uniquement les fichiers stockés sous le préfixe de clé « /foo » du compartiment donné.

$source = 's3://bucket/foo'; $dest = '/path/to/destination/dir'; $directoryTransfer = new \Aws\S3\Transfer($client, $source, $dest); $directoryTransfer->transfer();

Configuration

Le constructeur de l'objet Transfer accepte les arguments suivants.

$client

L'objet Aws\ClientInterface à utiliser pour effectuer les transferts.

$source(chaîne |Iterator)

Les données source concernées par le transfert. Cela peut pointer vers un chemin local sur le disque (par exemple/path/to/files) ou vers un compartiment Amazon S3 (par exemple,s3://bucket). L'URI s3:// peut également contenir un préfixe de clé qui peut être utilisé pour transférer uniquement les objets dotés d'un préfixe commun.

Si l'$sourceargument est un URI Amazon S3, il doit être un répertoire local (et vice versa). $dest

En plus de fournir une valeur de chaîne, vous pouvez également fournir un objet \Iterator qui génère des noms de fichier absolus. Si vous fournissez un \Iterator objet, vous devez fournir une base_dir option dans le tableau $options associatif.

$dest

La destination de transfert des fichiers. Si l'$sourceargument est un chemin local sur le disque, $dest il doit s'agir d'un URI de compartiment Amazon S3 (par exemple,s3://bucket). Si l'$sourceargument est un URI de compartiment Amazon S3, il doit être un chemin local sur le disque. $dest

$options

Un tableau associatif d’options de transfert. Les options de transfert suivantes sont valides :

add_content_md5 (bool)

Réglez sur true pour calculer le MD5 checksum pour les téléchargements.

base_dir (chaîne)

Répertoire de base de la source, si $source est un itérateur. Si l'option $source n'est pas un tableau, cette option est ignorée.

before (joignable)

Un rappel à invoquer avant chaque transfert. Les rappels doivent avoir une signature de fonction telle que function (Aws\Command $command) {...}. La commande fournie est une commande GetObject, PutObject, CreateMultipartUpload, UploadPart ou CompleteMultipartUpload.

mup_threshold (int)

Taille en octets pour laquelle il est préférable d'utiliser un chargement partitionné au lieu de PutObject. Sa valeur par défaut est de 16777216 (16 Mo).

concurrency (int, default=5)

Nombre de fichiers à charger simultanément. La valeur de simultanéité idéale varie en fonction du nombre de fichiers en cours de chargement et de la taille moyenne de chaque fichier. En général, les petits fichiers bénéficient d'une simultanéité plus élevée, contrairement aux fichiers plus volumineux.

debug (bool)

Définissez ce paramètre sur true pour imprimer les informations de débogage pour les transferts. Définissez ce paramètre sur une ressource fopen() pour écrire sur un flux spécifique au lieu d'écrire sur STDOUT.

Transferts asynchrones

L'objet Transfer est une instance de GuzzleHttp\Promise\PromisorInterface. Cela signifie que le transfert peut se produire de façon asynchrone et est initié en appelant la méthode de l'objet promise.

$source = '/path/to/source/files'; $dest = 's3://bucket'; $directoryTransfer = new \Aws\S3\Transfer($client, $source, $dest); // Initiate the transfer and get a promise. $promise = $directoryTransfer->promise(); // Do something when the transfer is complete using the then() method. $promise->then(function () { echo 'Done!'; });

La promesse est rejetée si le transfert d'un fichier échoue. Vous pouvez gérer les transferts en échec de façon asynchrone à l'aide de la méthode otherwise de la promesse. La fonction otherwise accepte un rappel pour invoquer lorsqu'une erreur se produit. Le rappel accepte le motif $reason de rejet, qui est généralement une instance de Aws\Exception\AwsException (bien qu'une valeur de n'importe quel type puisse être délivrée au rappel).

$promise->otherwise(function ($reason) { echo 'Transfer failed: '; var_dump($reason); });

Etant donné que l'objet Transfer renvoie une promesse, ces transferts peuvent se produire simultanément avec d'autres promesses asynchrones.

Personnalisation du transfert d'annuaire

En ajoutant un rappel au constructeur, vous pouvez personnaliser les options qu'il exécute. Transfer

$uploader = new Transfer($s3Client, $source, $dest, [ 'before' => function (\Aws\Command $command) { // Commands can vary for multipart uploads, so check which command // is being processed. if (in_array($command->getName(), ['PutObject', 'CreateMultipartUpload'])) { // Set custom cache-control metadata. $command['CacheControl'] = 'max-age=3600'; // Apply a canned ACL. $command['ACL'] = strpos($command['Key'], 'CONFIDENTIAL') ### false ? 'public-read' : 'private'; } }, ]);