

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Transfer direktori ke dan dari Amazon S3 menggunakan AWS SDK untuk PHP Versi 3
<a name="s3-transfer"></a>

Anda menggunakan `Transfer` kelas di AWS SDK untuk PHP Versi 3 untuk mengunggah seluruh direktori ke bucket Amazon S3 dan mengunduh seluruh bucket ke direktori lokal.

## Mengunggah direktori lokal ke 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)Objek melakukan transfer. Contoh berikut menunjukkan cara mengunggah direktori file lokal secara rekursif ke bucket 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();
```

Dalam contoh ini, kami membuat klien Amazon S3, membuat `Transfer` objek, dan melakukan transfer secara sinkron. 

Contoh sebelumnya menunjukkan jumlah minimum kode yang diperlukan untuk melakukan transfer. Sebuah `Transfer` objek juga dapat melakukan transfer secara asinkron dan memiliki berbagai opsi konfigurasi yang dapat Anda gunakan untuk menyesuaikan transfer.

Anda dapat mengunggah file lokal ke “subfolder” bucket Amazon S3 dengan menyediakan key prefix di URI. `s3://` Contoh berikut mengunggah file lokal pada disk ke `bucket` bucket dan menyimpan file di bawah `foo` key prefix.

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

## Mengunduh bucket Amazon S3
<a name="downloading-an-s3-bucket"></a>

Anda dapat mengunduh bucket Amazon S3 secara rekursif ke direktori lokal pada disk dengan menentukan `$source` argumen sebagai URI Amazon S3 (mis.`s3://bucket`,) dan argumen sebagai jalur `$dest` ke direktori lokal.

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

**catatan**  
SDK secara otomatis membuat direktori yang diperlukan saat mengunduh objek di ember.

Anda dapat menyertakan key prefix di Amazon S3 URI setelah bucket hanya mengunduh objek yang disimpan di bawah “pseudo-folder”. Contoh berikut hanya mengunduh file yang disimpan di bawah awalan kunci “/foo” dari bucket yang diberikan.

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

## Konfigurasi
<a name="configuration"></a>

Konstruktor `Transfer` objek menerima argumen berikut.

** `$client` **  
`Aws\ClientInterface`Objek yang digunakan untuk melakukan transfer.

** `$source`(string \$1`Iterator`)**  
Sumber data yang sedang ditransfer. Ini dapat menunjuk ke jalur lokal pada disk (misalnya,`/path/to/files`) atau bucket Amazon S3 (mis.,`s3://bucket`). `s3://`URI juga dapat berisi key prefix yang dapat digunakan untuk hanya mentransfer objek di bawah awalan umum.  
Jika `$source` argumennya adalah URI Amazon S3, `$dest` argumennya harus berupa direktori lokal (dan sebaliknya).  
Selain memberikan nilai string, Anda juga dapat memberikan `\Iterator` objek yang menghasilkan nama file absolut. Jika Anda memberikan `\Iterator` objek, Anda **harus** memberikan `base_dir` opsi dalam array `$options` asosiatif.

** `$dest` **  
Tujuan di mana file akan ditransfer. Jika `$source` argumennya adalah jalur lokal pada disk, `$dest` harus berupa URI bucket Amazon S3 (misalnya,`s3://bucket`). Jika `$source` argumennya adalah URI bucket Amazon S3, `$dest` argumennya harus berupa jalur lokal pada disk.

** `$options` **  
Array asosiatif opsi transfer. Opsi transfer berikut valid:    
**`add_content_md5`(bool)**  
Setel `true` untuk menghitung MD5 checksum untuk upload.  
** `base_dir`(tali)**  
Direktori dasar sumber, jika `$source` adalah iterator. Jika `$source` opsi ini bukan array, maka opsi ini diabaikan.  
** `before`(dapat dipanggil)**  
Panggilan balik untuk dipanggil sebelum setiap transfer. Callback harus memiliki tanda tangan fungsi seperti`function (Aws\Command $command) {...}`. Perintah yang diberikan akan berupa`GetObject`,`PutObject`,`CreateMultipartUpload`,`UploadPart`, atau `CompleteMultipartUpload` perintah.  
** `mup_threshold`(int)**  
Ukuran dalam byte di mana unggahan multibagian harus digunakan sebagai pengganti. `PutObject` Default ke `16777216` (16 MB).  
** `concurrency`(int, default=5)**  
Jumlah file yang akan diunggah secara bersamaan. Nilai konkurensi yang ideal akan bervariasi berdasarkan jumlah file yang diunggah dan ukuran rata-rata setiap file. Umumnya, file yang lebih kecil mendapat manfaat dari konkurensi yang lebih tinggi sementara file yang lebih besar tidak.  
** `debug`(bool)**  
Setel `true` untuk mencetak informasi debug untuk transfer. Setel ke `fopen()` sumber daya untuk menulis ke aliran tertentu alih-alih menulis ke STDOUT.

## Transfer async
<a name="async-transfers"></a>

`Transfer`Objek adalah contoh dari`GuzzleHttp\Promise\PromisorInterface`. Ini berarti bahwa transfer dapat terjadi secara asinkron dan dimulai dengan memanggil `promise` metode objek.

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

Janji ditolak jika ada file yang gagal ditransfer. Anda dapat menangani transfer yang gagal secara asinkron menggunakan `otherwise` metode janji. `otherwise`Fungsi menerima callback untuk memanggil ketika terjadi kesalahan. Callback menerima penolakan, yang biasanya merupakan instance dari `Aws\Exception\AwsException` (meskipun nilai jenis **apa pun** dapat dikirimkan ke callback). `$reason`

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

Karena `Transfer` objek mengembalikan janji, transfer ini dapat terjadi bersamaan dengan janji asinkron lainnya.

## Menyesuaikan transfer direktori
<a name="customizing-the-transfer-manager-s-commands"></a>

Dengan menambahkan callback ke konstruktor, Anda dapat menyesuaikan opsi yang dijalankan. `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';
        }
    },
]);
```