本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用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) {...}
的函式簽章。提供的命令將會是GetObject
、PutObject
、CreateMultipartUpload
、UploadPart
或CompleteMultipartUpload
命令。 -
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'; } }, ]);