

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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` (bool)**  
업로드에 대한 MD5 체크섬을 `true` 계산하려면 로 설정합니다.  
** `base_dir`(문자열)**  
`$source`가 반복자인 경우 소스의 기본 디렉터리입니다. `$source` 옵션이 배열이 아닌 경우 이 옵션이 무시됩니다.  
** `before`(callable)**  
각 전송 이전에 호출할 콜백입니다. 콜백에는 `function (Aws\Command $command) {...}`와 같은 함수 서명이 있어야 합니다. 제공되는 명령은 `GetObject`, `PutObject`, `CreateMultipartUpload`, `UploadPart` 또는 `CompleteMultipartUpload` 명령입니다.  
** `mup_threshold` (int)**  
`PutObject` 대신 사용할 멀티파트 업로드의 크기(바이트)입니다. 기본값은 `16777216`(16MB)입니다.  
** `concurrency`(정수, 기본값=5)**  
동시에 업로드할 파일 수입니다. 이상적인 동시성 값은 업로드 중인 파일 수와 각 파일의 평균 크기에 따라 다릅니다. 일반적으로 파일이 작을수록 동시성을 높여 이점을 얻을 수 있지만 파일이 크면 이점이 없습니다.  
** `debug` (bool)**  
전송에 대한 디버그 정보를 출력하려면 `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';
        }
    },
]);
```