

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SDK for PHP バージョン 3 を使用して Amazon S3 との間でディレクトリを転送する
<a name="s3-transfer"></a>

 AWS SDK for PHP バージョン 3 の `Transfer` クラスを使用して、ディレクトリ全体を Amazon S3 バケットにアップロードし、バケット全体をローカルディレクトリにダウンロードします。

## ローカルディレクトリの Amazon S3 へのアップロード
<a name="uploading-a-local-directory-to-s3"></a>

[https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.Transfer.html](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.Transfer.html) オブジェクトは転送を実行します。以下の例では、ローカルディレクトリのファイルを再帰的に 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.
$directoryTransfer = new \Aws\S3\Transfer($client, $source, $dest);

// Perform the transfer synchronously.
$directoryTransfer->transfer();
```

この例では、Amazon S3 クライアントを作成し、`Transfer` オブジェクトを作成して、同期転送を実行します。

前の例は、転送を実行するために必要なコードの最小量を示しています。`Transfer` オブジェクトは転送を非同期的に実行することもでき、転送をカスタマイズするために使用できるさまざまな設定オプションがあります。

`s3://` URI でキープレフィックスを指定することで、ローカルファイルを Amazon S3 バケットの「サブフォルダ」にアップロードできます。次の例では、ローカルディスク上のファイルを `bucket` バケットにアップロードして、`foo` キープレフィックスにファイルを保存します。

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

## Amazon S3 バケットのダウンロード
<a name="downloading-an-s3-bucket"></a>

`$source` 引数を Amazon S3 の URI (例: `s3://bucket`) および `$dest` 引数をローカルディレクトリへのパスとして指定することで、ディスクのローカルディレクトリに Amazon S3 バケットを再帰的にダウンロードできます。

```
// Where the files will be sourced from.
$source = 's3://bucket';

// Where the files will be transferred to.
$dest = '/path/to/destination/dir';

$directoryTransfer = new \Aws\S3\Transfer($client, $source, $dest);
$directoryTransfer->transfer();
```

**注記**  
SDK は、バケット内のオブジェクトをダウンロードするときに、必要なディレクトリを自動的に作成します。

「疑似フォルダ」に保存されたオブジェクトのみをダウンロードするには、Amazon S3 URI でバケットの後にキープレフィックスに含めることができます。次の例では、指定されたバケットのキープレフィックス「/foo」に保存されたファイルのみをダウンロードします。

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

## 設定
<a name="configuration"></a>

`Transfer` オブジェクトのコンストラクタでは次の引数を指定できます。

** `$client` **  
転送の実行に使用する `Aws\ClientInterface` オブジェクト。

** `$source` (文字列 \$1 `Iterator`)**  
転送されるソースデータ。これは、ディスク上のローカルパス (例 :`/path/to/files`) または Amazon S3 バケット (例 :`s3://bucket`) を指すことができます。`s3://` URI には、共通プレフィックスにあるオブジェクトのみを転送するために使用できるキープレフィックスも含めることができます。  
`$source` 引数が Amazon S3 の URI である場合は、`$dest` 引数がローカルディレクトリである必要があります (逆の場合も同様)。  
文字列値の提供だけでなく、絶対ファイル名を生成する `\Iterator` オブジェクトを提供することもできます。`\Iterator` オブジェクトを指定する場合は、`$options`関連付け配列に`base_dir`オプションを指定**する必要があります**。

** `$dest` **  
ファイルが転送される送信先。`$source` 引数がディスク上のローカルパスである場合、`$dest` は Amazon S3 バケット URI (例: `s3://bucket`) である必要があります。`$source` 引数が Amazon S3 バケット URI である場合、`$dest` 引数はディスク上のローカルパスである必要があります。

** `$options` **  
転送オプション の連想配列。有効な転送オプションは、次の通りです。    
**`add_content_md5` (ブール)**  
`true` に設定すると、アップロードの MD5 チェックサムを計算します。  
** `base_dir` (文字列)**  
`$source` がイテレーターの場合、ソースの基本ディレクトリ。`$source` オプションが配列ではない場合、このオプションは無視されます。  
** `before` (callable)**  
それぞれの転送の前に呼び出すコールバック。このコールバックは、`function (Aws\Command $command) {...}` のような関数の署名を持っている必要があります。指定されるコマンドは `GetObject`、`PutObject`、`CreateMultipartUpload`、`UploadPart`、または `CompleteMultipartUpload` コマンドです。  
** `mup_threshold` (int)**  
`PutObject` の代わりにマルチパートアップロードを使用するときのサイズ (バイト単位)。デフォルトで `16777216` (16 MB) に設定されます。  
** `concurrency` (int, default=5)**  
同時にアップロードするファイル数。理想的な同時実行値は、アップロードされるファイルの数と、各ファイルの平均サイズで変わります。一般的に、小さいファイルでは多数の同時実行により利点がありますが、大きいファイルではありません。  
** `debug` (ブール)**  
転送に関するデバッグ情報を出力するには `true` に設定します。STDOUT に書き込む代わりに、特定のストリームに書き込むには `fopen()` リソースに設定します。

## 非同期転送
<a name="async-transfers"></a>

`Transfer` オブジェクトは `GuzzleHttp\Promise\PromisorInterface` のインスタンスです。つまり、転送は非同期的に行われ、オブジェクトの `promise` メソッドを呼び出すことで、処理が開始されます。

```
$source = '/path/to/source/files';
$dest = 's3://bucket';
$directoryTransfer = new \Aws\S3\Transfer($client, $source, $dest);

// Initiate the transfer and get a promise.
$promise = $directoryTransfer->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 と同時に発生する可能性があります。

## ディレクトリ転送のカスタマイズ
<a name="customizing-the-transfer-manager-s-commands"></a>

コンストラクタにコールバックを追加することで、 が`Transfer`実行するオプションをカスタマイズできます。

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