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'URIs3://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).$destEn plus de fournir une valeur de chaîne, vous pouvez également fournir un objet
\Iteratorqui génère des noms de fichier absolus. Si vous fournissez un\Iteratorobjet, vous devez fournir unebase_diroption dans le tableau$optionsassociatif. -
$dest -
La destination de transfert des fichiers. Si l'
$sourceargument est un chemin local sur le disque,$destil 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
truepour calculer le MD5 checksum pour les téléchargements. -
base_dir(chaîne) -
Répertoire de base de la source, si
$sourceest un itérateur. Si l'option$sourcen'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 commandeGetObject,PutObject,CreateMultipartUpload,UploadPartouCompleteMultipartUpload. -
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 de16777216(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
truepour imprimer les informations de débogage pour les transferts. Définissez ce paramètre sur une ressourcefopen()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'; } }, ]);