はじめに
Laravel公式リファレンスでは、Amazon S3のファイルを取り扱う方法として、
Storageファサードを使用する方法が紹介されています。
しかし、Storageファサードを使用する方法では、
S3でバージョニングを有効化したバゲットのファイルを取り扱うことができないようです。
正確には、
・アップロード時に、アップロードしたファイルのバージョンIDを取得することができない
・ダウンロード時に、ダウンロードするファイルのバージョンIDを指定することができない
です。
この問題は、AWS SDKを使用することで解決します。
前提条件
- Laravel 5.8.24で動作確認しました。
- aws/aws-sdk-phpがインストール済であるものとします。
- Amazon S3の設定については割愛します。
環境変数
以下の変数を設定します。
.env
// ...
AWS_ACCESS_KEY_ID==(IAMユーザーのアクセスキーID)
AWS_SECRET_ACCESS_KEY=(IAMユーザーのシークレットアクセスキー)
AWS_DEFAULT_REGION=(バゲットを作成したリージョン)
AWS_BUCKET=(作成したバゲットの名前)
アップロード
putObject()メソッドの戻り値 'VersionId' からバージョンIDを取得することができます。
public function upload($key, $body, $content_type)
{
$params = array();
$params['Bucket'] = env('AWS_BUCKET');
$params['Key'] = $key;
$params['Body'] = $body;
$params['ContentType'] = $content_type;
$result = \Aws\Laravel\AwsFacade::createClient('s3')->putObject($params);
return $result['VersionId'];
}
※ サーバ上のファイルをアップロードする場合、パラメータ 'Body' と 'ContentType' は不要で、
その代わりに 'SourceFile' にそのパスを指定します。
ダウンロード
getObject()メソッドのパラメータ 'VersionId' にバージョンIDを指定することができます。
バージョンIDを省略した場合は、最新バージョンのファイルをダウンロードします。
public function download($key, $version_id = null)
{
$params = array();
$params['Bucket'] = env('AWS_BUCKET');
$params['Key'] = $key;
if (!is_null($version_id)) {
$params['VersionId'] = $version_id;
}
return \Aws\Laravel\AwsFacade::createClient('s3')->getObject($params);
}
ミニマムコードであるため、必要に応じて書き換えてください。