目錄操作 - 適用於 PHP 的 AWS SDK

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

目錄操作

S3 Transfer Manager 可以處理整個目錄傳輸。

上傳目錄

S3 Transfer Manager 可以將整個目錄上傳至 S3 儲存貯體。<上傳時,金鑰值是否為檔案名稱?>

<?php use Aws\S3\S3Transfer\Models\UploadDirectoryRequest; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager(null, [ 'default_region' => 'us-west-2' ]); $uploadDirPromise = $transferManager->uploadDirectory( new UploadDirectoryRequest( '/path/to/local/directory', 'amzn-s3-demo-bucket', [ // Additional `putObject` parameters that apply to all files. 'ACL' => 'public-read', 'CacheControl' => 'max-age=3600', ], [ // Configuration options. 'recursive' => true, 'follow_symbolic_links' => false, 's3_prefix' => 'uploads/2023/', 's3_delimiter' => '/', 'track_progress' => true, 'filter' => function ($file) { // Upload only .jpg files. return pathinfo($file, PATHINFO_EXTENSION) === 'jpg'; }, 'upload_object_request_modifier' => function ($args) { // Customize request arguments for each file. $args['ContentType'] = 'image/jpeg'; }, ] ) ); // Wait for the upload process to complete. $result = $uploadDirPromise->wait(); $uploaded = $result->getObjectsUploaded(); $failed = $result->getObjectsFailed(); echo "Uploaded {$uploaded} files. Failed: {$failed}\n";

uploadDirectory 方法參數

uploadDirectory 方法接受 UploadDirectoryRequest<add link> 的執行個體做為引數。

UploadDirectoryRequest 參數

參數 Type 必要 描述

$sourceDirectory

string

要上傳的本機目錄路徑。

$targetBucket

string

目的地 S3 儲存貯體名稱。

$uploadRequestArgs

陣列

所有檔案的其他上傳物件請求參數。

$config

陣列

目錄上傳的組態選項。如需組態選項的詳細資訊,請參閱下一節

$listeners

陣列

TransferListener 物件的陣列。開發套件會複製TransferListener每個檔案的每個。

$max_depth

bool

-1 "執行時間預設值"

指出遞迴檔案三次演練的最大深度。

$progressTracker

TransferListener

所有上傳的進度追蹤器。

選項 Type 預設 Description

recursive

bool

false

是否要遞迴上傳子目錄。

follow_symbolic_links

bool

false

是否遵循符號連結。

s3_prefix

string

''

要新增至所有物件金鑰的字首。

s3_delimiter

string

'/'

要在 S3 物件金鑰中使用的分隔符號。

track_progress bool false 是否追蹤進度。

max_concurrency

int 100 並行上傳的數量上限。

filter

可呼叫

null

用於篩選要上傳哪些檔案的函數。

upload_object_request_modifier

可呼叫

null

用於自訂每個上傳請求的函數。

failure_policy

可呼叫

null

處理上傳失敗的函數。

可呼叫$config的選項類型
選項名稱 參數名稱 參數類型 參數資訊
filter $file SplFileInfo|字串

如果轉換為字串,則為檔案路徑。否則,它是 的執行個體SplFileInfo

upload_object_request_modifier $requestArgs 陣列 每個個別上傳請求的請求引數。如需陣列選項的詳細資訊,請參閱 putObject 方法參數語法一節。
failure_policy $uploadRequestArgs 陣列 每個個別上傳請求的請求引數。如需陣列選項的詳細資訊,請參閱 putObject 方法的陣列選項參數語法區段。
$uploadDirectoryArgs 陣列 具有來源目錄和目標儲存貯體的陣列,用於上傳目錄操作。
$reason Throwable|字串

例外狀況持有者,其中包含造成失敗的原因資訊。

$uploadDirectoryResult UploadDirectoryResult 包含成功上傳物件數量和失敗數量的物件。

uploadDirectory方法成功執行時,它會傳回 UploadDirectoryResult <add link>

下載目錄

您可以從 S3 儲存貯體下載目錄。<下載時,檔案名稱是否為索引鍵值? 如果金鑰中沒有副檔名,檔案上是否也沒有副檔名?>

<?php use Aws\S3\S3Transfer\Models\DownloadDirectoryRequest; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager(null, [ 'default_region' => 'us-west-2' ]); $downloadDirPromise = $transferManager->downloadDirectory( new DownloadDirectoryRequest( 'amzn-s3-demo-bucket', '/path/to/local/directory', [ // Additional `getObject` parameters that apply to all files. ], [ // Configuration options. 's3_prefix' => 'uploads/2023/', 's3_delimiter' => '/', 'track_progress' => true, 'filter' => function ($key) { // Download only .jpg files. return pathinfo($key, PATHINFO_EXTENSION) === 'jpg'; }, 'download_object_request_modifier' => function ($args) { // Customize request arguments for each file. $args['ResponseContentType'] = 'image/jpeg'; }, 'list_objects_v2_args' => [ 'MaxKeys' => 1000, 'Prefix' => 'uploads/2023/', ], 'fails_when_destination_exists' => true, ] ) ); // Wait for the download process to complete. $result = $downloadDirPromise->wait(); $downloaded = $result->getObjectsDownloaded(); $failed = $result->getObjectsFailed(); echo "Downloaded {$downloaded} files. Failed: {$failed}\n";

downloadDirectory 方法參數

downloadDirectory 方法接受 DownloadDirectoryRequest<add link> 執行個體做為引數。

DownloadDirectoryRequest 參數

參數 Type 必要 描述

$sourceBucket

string

下載物件的來源 S3 儲存貯體名稱。

$destinationDirectory

string

要下載檔案的本機目錄。

$downloadRequestArgs

陣列

所有檔案的其他下載物件請求參數。

$config

陣列

目錄下載的組態選項。如需組態選項的詳細資訊,請參閱下一節

$listeners

陣列

TransferListener 物件的陣列。開發套件會複製TransferListener每個檔案的每個。

$progressTracker

TransferListener

所有下載的進度追蹤器。

選項 Type 預設 Description

s3_prefix

string

''

用於篩選的字首 (如果不在 中list_objects_v2_args)。

track_progress

bool

false

是否追蹤進度。

filter

可呼叫

null

用於篩選要下載哪些 S3 物件的函數。

download_object_request_modifier

可呼叫

null

用於自訂每個下載請求的 函數。

list_objects_v2_args

陣列

[]

ListObjectsV2 操作的引數。此操作會擷取要下載物件的中繼資料。

fails_when_destination_exists

bool

false

當物件目的地檔案路徑已存在時是否失敗。

failure_policy

可呼叫

null

處理下載失敗的函數。

max_concurrency

int

100

並行下載的最大數量。

target_part_size_bytes

int

各有不同

分段下載類型範圍的分段下載的分段大小。

可呼叫$config的選項類型
選項名稱 參數名稱 參數類型 參數資訊
filter $objectKey string

儲存貯體中的物件金鑰名稱。

download_object_request_modifier $requestArgs 陣列 每個個別下載請求的請求引數。如需陣列選項的詳細資訊,請參閱 getObject 方法參數語法一節。
failure_policy $downloadObjectRequestArgs 陣列

每個個別下載請求的請求引數。如需陣列選項的詳細資訊,請參閱 getObject 方法參數語法一節。

$downloadDirectoryRequest 陣列

具有來源儲存貯體和目標目錄的陣列,用於下載目錄操作。

$reason Throwable

例外狀況持有者,其中包含造成失敗的原因資訊。

$downloadDirectoryResult DownloadDirectoryResult <新增連結>

包含成功下載的物件數量和失敗的物件數量的物件。

目錄操作的運作方式

本節說明 S3 Transfer Manager 如何在目錄操作期間處理檔案路徑和物件金鑰。

上傳路徑處理

當您上傳目錄時,軟體開發套件會從檔案路徑建構 S3 物件金鑰:

  1. 計算每個檔案相對於來源目錄的路徑

  2. 如果指定,則加上s3_prefix值 (自動新增結尾斜線)

  3. 將作業系統目錄分隔符號取代為 s3_delimiter(預設 /)

recursive 選項控制是否包含子目錄。當 false(預設) 時,只會上傳最上層檔案。當 時true,會上傳子目錄中的所有檔案,並在物件索引鍵中保留目錄結構。

注意

每個上傳檔案的 S3 中索引鍵將為提供的 s3 字首,預設為 null,加上從指定來源目錄開始的檔案相對路徑。此外,我們將已解析金鑰名稱中的目錄分隔符號取代為提供的 s3 分隔符號,預設為 /。

範例 1

$sourceDirectory = "/opt/my-upload-directory"; $s3Prefix = "important/"; $s3Delimiter = "/"; // Default value

目錄結構

/opt/my-upload-directory/ -- my-file1.txt -- my-file-2.txt -- sub-dir/ ---- my-another-file1.txt ---- my-another-file2.txt

每個檔案的金鑰為:

$s3Prefix + $fileRelativePath;
- important/my-file1.txt - important/my-file-2.txt - important/sub-dir/my-another-file1.txt - important/sub-dir/my-another-file2.txt

範例 2

$sourceDirectory = "/opt/my-docs"; $s3Prefix = ''; // No provided and it will defaulted to empty string $s3Delimiter = "/"; // Default value

目錄結構

/opt/my-docs/ -- my-file1.txt -- my-file-2.txt -- sub-dir/ ---- my-another-file1.txt ---- my-another-file2.txt

每個檔案的金鑰為:

$s3Prefix + $fileRelativePath;
- my-file1.txt - my-file-2.txt - sub-dir/my-another-file1.txt - sub-dir/my-another-file2.txt
範例上傳目錄路徑處理
<?php // Source directory: /home/user/photos/ // fla/beach.jpg // fla/sunset.jpg // fla/pool/party.jpg // With s3_prefix: '2023' and recursive: true // Results: // 2023/fla/beach.jpg // 2023/fla/sunset.jpg // 2023/fla/pool/party.jpg

下載路徑處理

當您下載目錄時,軟體開發套件會從 S3 物件金鑰建構本機檔案路徑:

  1. 如果指定,s3_prefix從物件金鑰移除

  2. 以作業系統目錄分隔符號取代 S3 分隔符號 (/)

  3. 將結果附加至目的地目錄

下載一律是遞迴的。SDK 會擷取指定字首下的所有物件,並視需要建立子目錄。為了安全起見,它會驗證路徑未在目的地目錄之外解析。

範例下載目錄路徑處理
<?php // S3 objects: // 2023/fla/beach.jpg // 2023/fla/sunset.jpg // 2023/fla/pool/party.jpg // With s3_prefix: '2023' and destination: /home/user/downloads // Results: // /home/user/downloads/fla/beach.jpg // /home/user/downloads/fla/sunset.jpg // /home/user/downloads/fla/pool/party.jpg
注意

下載物件的檔案路徑將解析如下:

  • 如果提供 s3 字首,則會從物件金鑰中移除。

  • 如果 s3Delimiter 與作業系統目錄分隔符號不同,則會以作業系統目錄分隔符號取代 s3 分隔符號。

範例 1

$s3Prefix = "my-prefix"; $s3Objects = [ "my-prefix/file-1.txt", "my-prefix/file-2.txt", "my-prefix/subdir/file-1.txt" ]; $targetDirectory = "/opt/bucket/downloads/";

下載這些物件後,將會放置如下:

/opt/bucket/downloads/ -- file-1.txt -- file-2.txt -- subdir/ ---- file-1.txt

如我們所見,字首已從物件的最終檔案路徑中移除。

範例 2 - 沒有 s3 字首

$s3Prefix = ""; // No provided $s3Objects = [ "README.md", "my-docs/file-1.txt", "my-docs/file-2.txt", "my-docs/statements/file-1.txt" ]; $targetDirectory = "/opt/bucket/downloads/";

下載這些物件後,將會放置如下:

/opt/bucket/downloads/ -- README.md -- my-docs/ ---- file-1.txt ---- file-2.txt ---- statements/ ------ file-1.txt