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.
Gestionnaire de transfert Amazon S3 avec AWS SDK for PHP version 3
Le gestionnaire de transfert Amazon S3 intégré au AWS SDK for PHP est utilisé pour charger des répertoires entiers dans un compartiment Amazon S3 et pour télécharger des compartiments entiers dans un répertoire local.
Chargement d'un répertoire local sur Amazon S3
L'objet Aws\S3\Transfer
est utilisé pour effectuer des 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. $manager = new \Aws\S3\Transfer($client, $source, $dest); // Perform the transfer synchronously. $manager->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é de code minimale nécessaire pour effectuer un transfert. L'objet de transfert peut 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'; $manager = new \Aws\S3\Transfer($client, $source, $dest); $manager->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'$source
argument sous forme d'URI Amazon S3 (par exemple,s3://bucket
) et l'$dest
argument 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'; $manager = new \Aws\S3\Transfer($client, $source, $dest); $manager->transfer();
Note
Le kit SDK crée automatiquement tous les répertoires nécessaires lors du téléchargement des objets dans le 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'; $manager = new \Aws\S3\Transfer($client, $source, $dest); $manager->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'
$source
argument 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 itérateur, vous devez fournir une optionbase_dir
dans le tableau associatif$options
. -
$dest
-
La destination de transfert des fichiers. Si l'
$source
argument 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'$source
argument 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)-
Définissez sur pour
true
calculer la somme de contrôle MD5 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 commandeGetObject
,PutObject
,CreateMultipartUpload
,UploadPart
ouCompleteMultipartUpload
. -
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
true
pour 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'; $manager = new \Aws\S3\Transfer($client, $source, $dest); // Initiate the transfer and get a promise. $promise = $manager->promise(); // Do something when the transfer is complete using the then() method. $promise->then(function () { echo 'Done!'; });
La promesse sera rejetée si le transfert de l'un des fichiers é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 la $reason
du rejet, qui sera généralement une instance de Aws\Exception\AwsException
(même si une valeur de type any peut être fournie 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 des commandes du gestionnaire de transferts
Vous pouvez définir des options personnalisées sur les opérations exécutées par le gestionnaire de transfert via un rappel transmis à son constructeur.
$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'; } }, ]);