使用AWS SDK for PHP版本 3 的 Amazon S3 傳輸管理器 - AWS SDK for PHP

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用AWS SDK for PHP版本 3 的 Amazon S3 傳輸管理器

中的 Amazon S3 傳輸管理員可用來將整個目錄上傳到 Amazon S3 儲存貯體,並將整個儲存貯體下載到本機目錄。AWS SDK for PHP

將本地目錄上傳到 Amazon S3

Aws\S3\Transfer 物件是用來進行傳輸。下列範例顯示如何遞迴地將檔案的本機目錄上傳到 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();

在此範例中,我們建立了 Amazon S3 用戶端、建立Transfer物件,然後同步執行傳輸。使用之前的範例,來示範進行傳輸所需的最低限度程式碼數量。傳輸物件可以非同步方式進行傳輸,並具備各種組態選項,您可用來自訂傳輸。

您可以在 s3:// URI 中提供 key prefix,將本機檔案上傳到 Amazon S3 儲存貯體的「子資料夾」。下列的範例將磁碟上的本機檔案上傳到 bucket 儲存貯體,並儲存金鑰前綴為 foo 的儲存檔案。

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

下載 Amazon S3 存儲桶

您可以將引數指定為 Amazon S3 URI (例如s3://bucket),並將$source引數指定為本機目錄的路徑,以遞迴方式將 Amazon S3 儲存貯體下載到磁碟上的本機目錄。$dest

// 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();
注意

在下載儲存貯體中的物件時,軟體開發套件會自動建立所有必要的目錄。

您可以在儲存貯體後面的 Amazon S3 URI 中加入金鑰前置詞,以便僅下載存放在「虛擬資料夾」下的物件。以下範例只會下載指定儲存貯體以 ”/foo” 金鑰前綴儲存的檔案。

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

組態

Transfer 物件建構函式接受下列引數。

$client

用來執行傳輸的 Aws\ClientInterface 物件。

$source(字符串 |Iterator

正在傳輸的原始碼資料。這可以指向磁碟上的本機路徑 (例如/path/to/files) 或 Amazon S3 儲存貯體 (例如s3://bucket)。s3:// URI 也可以包含金鑰前綴,用來只傳輸使用共同前綴的物件。

如果引$source數是 Amazon S3 URI,則$dest引數必須是本機目錄 (反之亦然)。

除了提供字串值,您也可以提供 \Iterator 物件,此物件會產生絕對的檔案名稱。如果提供了疊代器,則您必須$options 關聯陣列中提供 base_dir 選項。

$dest

檔案傳輸的目的地。如果引$source數是磁碟上的本機路徑,則$dest必須是 Amazon S3 儲存貯體 URI (例如s3://bucket)。如果引$source數是 Amazon S3 儲存貯體 URI,則$dest引數必須是磁碟上的本機路徑。

$options

傳輸選項的關聯陣列。以下是有效的傳輸選項:

add_content_md5 (bool)

設定為true以計算上傳的 MD5 總和檢查碼。

base_dir (string)

來源的基本目錄 (如果 $source 為疊代器)。如果 $source 選項不是陣列,則會略過此選項。

before (可呼叫)

在每次傳輸前呼叫的回呼函式。回呼函式應具有像是 function (Aws\Command $command) {...} 的函式簽章。提供的命令將會是 GetObjectPutObjectCreateMultipartUploadUploadPartCompleteMultipartUpload 命令。

mup_threshold (int)

分段上傳應使用的大小 (而非使用 PutObject),單位為位元組。預設為 16777216 (16 MB)。

concurrency (整數,預設 = 5)

要同時上傳的檔案數量。理想的並行值,將會視待上傳檔案的數量,以及每個檔案的平均大小而有不同。一般而言,相較於大型檔案,較小的檔案在並行數值較高時具有較大的優勢。

debug (bool)

設定為 true 可印出傳輸的偵錯資訊。設定為 fopen() 資源,可寫入特定串流,而非寫入 STDOUT。

非同步傳輸

Transfer 物件是 GuzzleHttp\Promise\PromisorInterface 的執行個體。這表示傳輸可以非同步進行,也可透過呼叫物件的 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!'; });

如果有任何的檔案無法傳輸,promise 物件的操作將會遭到拒絕。您可以使用 promise 物件的 otherwise 方法,來以非同步方式處理失敗的傳輸。otherwise 函式可接受回呼,在發生錯誤時呼叫。回呼函式會接受拒絕的 $reason,這通常是 Aws\Exception\AwsException 的執行個體 (雖然任何類型的值皆可傳送到回呼函式)。

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

由於 Transfer 物件會傳回 promise 的值,這些傳輸可和其他的非同步 promise 物件同時執行。

自訂傳輸管理員的指令

透過將回呼函式傳遞至其建構函式,也可在傳輸管理程式執行操作時,設定自訂的選項。

$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'; } }, ]);