Symfony uygulamalarında AWS SDK for PHP kütüphanesini kullanarak AWS S3 kovalarına dosya atmak isterseniz, aşağıdaki örneği kullanabilirsiniz. Biz bu örnekte kovaya bir video dosyası atacağız. Daha fazla bilgi için Get an Object Using the AWS SDK for PHP sayfasını okuyun.


Ön şartlar


Öncelikle, kovaların ve klasörlerinin içeriğinin tarayıcılarda listelenmesini önlemek istiyoruz. Bu özelliği sağlamak için, kovaya "Bucket Policy" eklememiz gerekiyor. Eğer "Permissions -> Bucket Policy" sekmesine giderseniz, sayfanın alt kısmında "Policy generator" butonunu görürsünüz. Bu butonu kullanırsanız, uygun bir policy oluşturabilirsiniz. İstemiyorsanız, yalnızca aşağıdaki policyi kopyalayıp yapıştırabilirsiniz. Kovamızın my-videos olduğunu varsayıp herkesin GetObject iznine sahip olmasını istiyoruz. Not: "Public access" bölümündeki "Everyone" seçeneğinde hiçbir şekilde izin verilmediğinden emin olun.


{
"Version": "2012-10-17",
"Id": "Policy1530100021111",
"Statement": [
{
"Sid": "Stmt1530100001111",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-videos/*"
}
]
}

Eğer isterseniz kovanın tamamını varsayılan olarak "private" olarak atayabilirsiniz. Daha sonra yükleme sırasında nesneleri "public" hale getirmek için putObject fonksiyonuna 'ACL' => 'public-read' özelliğini ekleyebilirsiniz.


Dosyalar


.env


# User: These credentials belong to "AmazonS3FullAccess" user.
AWS_KEY=AMAZON000KEY
AWS_SECRET=AMAZON000SECRET
AWS_IMAGE_BUCKET=my-images-bucket

config/services.yaml


parameters:

# AWS SDK
aws_sdk:
version: 'latest'
region: 'eu-west-2'
credentials:
key: '%env(AWS_KEY)%'
secret: '%env(AWS_SECRET)%'

services:
_defaults:
autowire: true
autoconfigure: true
public: false

...

Aws\Sdk:
arguments:
- '%aws_sdk%'

Util/Aws/AwsUtil.php


declare(strict_types=1);

namespace App\Util\Aws;

use Aws\Sdk;

abstract class AwsUtil
{
protected $sdk;

public function __construct(Sdk $sdk)
{
$this->sdk = $sdk;
}
}

Util/Aws/AwsS3Util.php


declare(strict_types=1);

namespace App\Util\Aws;

use App\Exception\AwsUtilException;
use Aws\S3\Exception\S3Exception;

class AwsS3Util extends AwsUtil
{
public function putObject(string $bucket, string $path, string $name): string
{
try {
$client = $this->sdk->createS3();
$result = $client->putObject(['Bucket' => $bucket, 'Key' => $name, 'SourceFile' => $path]);
$client->waitUntil('ObjectExists', ['Bucket' => $bucket, 'Key' => $name]);

return $result['ObjectURL'];
} catch (S3Exception $e) {
throw new AwsUtilException($e->getMessage());
}
}
}

Test


putObject('my-videos', '/local/path/app/hello.mp4', 'hello.mp4')

Daha sonra videoya erişmek için yanıt içinde gelen URL'yi kullanabilirsiniz.