Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Amazon S3 Transfer Manager mit AWS SDK for PHP Version 3
Der Amazon S3 Transfer Manager in der AWS SDK for PHP wird verwendet, um ganze Verzeichnisse in einen Amazon S3-Bucket hochzuladen und ganze Buckets in ein lokales Verzeichnis herunterzuladen.
Hochladen eines lokalen Verzeichnisses in Amazon S3
Das Aws\S3\Transfer
-Objekt wird für Übertragungen verwendet. Das folgende Beispiel zeigt, wie Sie ein lokales Dateiverzeichnis rekursiv in einen Amazon S3-Bucket hochladen.
// 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();
In diesem Beispiel haben wir einen Amazon S3-Client erstellt, ein Transfer
Objekt erstellt und die Übertragung synchron durchgeführt. Die Verwendung des vorherigen Beispiels demonstriert den minimalen Code, der für eine Übertragung benötigt wird. Das Übertragungsobjekt kann Übertragungen asynchron durchführen und verfügt über verschiedene Konfigurationsmöglichkeiten, mit denen Sie die Übertragungen anpassen können.
Sie können die lokalen Dateien in einen „Unterordner“ eines Amazon S3-Buckets hochladen, indem Sie ein Schlüsselpräfix in der s3://
URI angeben. Im folgenden Beispiel werden die lokalen Dateien auf dem Datenträger in den bucket
-Bucket hochgeladen und die Dateien unter dem Schlüsselpräfix foo
gespeichert.
$source = '/path/to/source/files';
$dest = 's3://bucket/foo';
$manager = new \Aws\S3\Transfer($client, $source, $dest);
$manager->transfer();
Herunterladen eines Amazon S3-Buckets
Sie können einen Amazon S3-Bucket rekursiv in ein lokales Verzeichnis auf der Festplatte herunterladen, indem Sie das $source
-Argument als Amazon S3-URI (z. B. s3://bucket
) und das $dest
-Argument als Pfad zu einem lokalen Verzeichnis angeben.
// 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();
Anmerkung
Das SDK erstellt automatisch alle erforderlichen Verzeichnisse, wenn Sie Objekte in den Bucket herunterladen.
Sie können nach dem Bucket ein Schlüsselpräfix in den Amazon S3-URI einfügen, um nur Objekte herunterzuladen, die unter einem „Pseudoordner“ gespeichert sind. Das folgende Beispiel lädt nur Dateien herunter, die unter dem Schlüsselpräfix „/ foo“ des betreffenden Buckets gespeichert sind.
$source = 's3://bucket/foo';
$dest = '/path/to/destination/dir';
$manager = new \Aws\S3\Transfer($client, $source, $dest);
$manager->transfer();
Konfiguration
Der Transfer
-Objektkonstruktor akzeptiert die folgenden Argumente:
-
$client
-
Das
Aws\ClientInterface
-Objekt für die Ausführung der Übertragungen. -
$source
(Zeichenfolge |Iterator
) -
Die zu übertragenden Quelldaten. Dies kann auf einen lokalen Pfad auf der Festplatte (z. B.
/path/to/files
) oder auf einen Amazon S3-Bucket (z. B.s3://bucket
) verweisen. Dies3://
-URI kann auch ein Schlüsselpräfix enthalten, das verwendet werden kann, um nur Objekte unter einem gemeinsamen Präfix zu übertragen.Wenn das
$source
Argument ein Amazon S3-URI ist, muss das$dest
Argument ein lokales Verzeichnis sein (und umgekehrt).Neben der Bereitstellung eines Zeichenfolgenwerts können Sie auch ein
\Iterator
-Objekt angeben, das absolute Dateinamen erzeugt. Wenn Sie einen Iterator bereitstellen, müssen Sie einebase_dir
-Option im assoziativen Array$options
bereitstellen. -
$dest
-
Das Ziel, an das die Dateien übertragen werden. Wenn das
$source
Argument ein lokaler Pfad auf der Festplatte ist,$dest
muss ein Amazon S3-Bucket-URI sein (z. B.s3://bucket
). Wenn das Argument ein Amazon S3$source
-Bucket-URI ist, muss das$dest
Argument ein lokaler Pfad auf der Festplatte sein. -
$options
-
Ein assoziatives Array mit Übertragungsoptionen. Die folgenden Übertragungsoptionen sind gültig:
add_content_md5
(bool)-
Legen Sie den Wert auf fest
true
, um die MD5-Prüfsumme für Uploads zu berechnen. -
base_dir
(string) -
Basisverzeichnis der Quelle, wenn
$source
ein Iterator ist. Wenn die$source
-Option kein Array ist, wird diese Option ignoriert. -
before
(aufrufbar) -
Ein Callback, der vor jeder Übertragung aufgerufen wird. Der Callback sollte eine Funktionssignatur wie
function (Aws\Command $command) {...}
haben. Der bereitgestellte Befehl istGetObject
PutObject
,CreateMultipartUpload
,UploadPart
oderCompleteMultipartUpload
. -
mup_threshold
(int) -
Größe in Bytes, für die ein mehrteiliger Upload statt
PutObject
verwendet werden soll. Standardwert16777216
(16 MB). -
concurrency
(int, default=5) -
Anzahl der Dateien, die gleichzeitig hochgeladen werden. Die ideale Nebenläufigkeitswert variiert abhängig von der Anzahl der Dateien, die hochgeladen werden, und der durchschnittlichen Größe der einzelnen Datei. Im Allgemeinen profitieren kleinere Dateien von einer höheren Nebenläufigkeit, während größere Dateien dies nicht tun.
-
debug
(bool) -
Auf
true
setzen, um Debugging-Informationen für Übertragungen auszugeben. Auf einefopen()
-Ressource setzen, um statt auf STDOUT in einen bestimmten Stream zu schreiben.
Asynchrone Übertragungen
Das Transfer
-Objekt ist eine Instance von GuzzleHttp\Promise\PromisorInterface
. Das bedeutet, dass die Übertragung asynchron stattfinden kann und durch Aufruf der promise
-Methode des Objekts ausgelöst wird.
$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!';
});
Das Promise wird abgelehnt, wenn eine der Dateien nicht übertragen werden kann. Sie können die fehlgeschlagene Übertragung asynchron unter Verwendung der otherwise
-Methode des Promise verarbeiten. Die otherwise
-Funktion akzeptiert einen Callback, der aufgerufen wird, wenn ein Fehler auftritt. Der Callback akzeptiert die $reason
für die Ablehnung, die in der Regel eine Instance von Aws\Exception\AwsException
ist (allerdings kann dem Callback ein Wert eines beliebigen Typs übergeben werden).
$promise->otherwise(function ($reason) {
echo 'Transfer failed: ';
var_dump($reason);
});
Da das Transfer
-Objekt ein Promise zurückgibt, können diese Übertragungen gleichzeitig mit anderen asynchronen Promises stattfinden.
Anpassen der Befehle des Transfer Managers
Benutzerdefinierte Optionen können auf die vom Transfer Manager ausgeführten Operationen über einen Callback festgelegt werden, der an seinen Konstruktor übergeben wird.
$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';
}
},
]);