PHPの案件で「Amazon S3」にファイルをアップロードする事がありました。
Laravelであれば「filesystems」や「Storge」を使えば簡単にアップロードできますが、今回はそれらが使えなかったためPHPのみでアップロードする方法をまとめました。
環境
- PHP 7.4
- Composer 2.0.8
- AWS SDK for PHP 3.180.0
準備
「Amazon S3」にバケットを作成して、アクセスできるようにしておきます。
その方法は以前にご紹介いたしました。
1.「AWS SDK for PHP」をインストール
まずは「AWS SDK for PHP」をインストールします。
古いプロジェクトだと「composer」が入っていない可能性もあるので、ここは確認しておきましょう。
composer require aws/aws-sdk-php
2.「Amazon S3」にファイルをアップロード
PHPで「Amazon S3」にファイルをアップロードする方法は以下の通りです。
以下はEC2にロールを設定してるケースと開発環境で切り分けて使用できるようにしております。
「getenv」で環境変数を取得しているので、開発環境であれば「.env」ファイルに設定しておくと良いでしょう。
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
// クライアントパラメータ
$clientParam = [
'region' => 'ap-northeast-1',
'version' => 'latest',
];
// 認証情報は開発版でアクセスキーなどを設定しますが、EC2などでロールを設定してた場合は不要となります。
if (getenv('AWS_ACCESS_KEY_ID') && getenv('AWS_SECRET_ACCESS_KEY')) {
// AWS 認証情報
$credentials = new Credentials(getenv('AWS_ACCESS_KEY_ID'), getenv('AWS_SECRET_ACCESS_KEY'));
$clientParam["credentials"] = $this->credentials;
}
// S3クライアントの作成
$s3 = new S3Client($clientParam);
// バケット名
$bucket = 'バケット名';
// アップロードするファイル
$filePath = 'アップロードするファイルのパス';
// ファイル名
$fileName = basename($filePath);
// アップロード
$result = $s3->putObject([
'Bucket' => $bucket,
'Key' => $fileName,
'SourceFile' => $filePath,
'ACL' => 'public-read'
]);
// 結果を表示
var_dump($result);
上記では一旦ファイルをどこかに保存してアップロードするようになっておりますが、直接アップロードされたファイルをS3にアップロードする場合は「getRealPath」を使用します。
$upfile->getRealPath()
この方法でとりあえずアップロードすることが出来ました。
Laravelだと用意されているので簡単にできますが、PHPだと上記をクラス化などして使いやすくするといいかもしれません。