Laravel
【Laravel+S3】保存時にユーザー定義のmetadataを保存する方法
いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。
オススメ本
Laravel から S3 にファイルを保存するときに metadata として任意のパラメーターを付与する方法についてまとめています。
結論から
use Storage;
classTestController extends Controller
{
public function store(Request $request)
{
$disk = Storage::disk('s3');
$params = [
'visibility' => 'public',
'Metadata' => [
'x-amz-meta-post_id' => '1'
]
];
$path = $disk->put('test',$request->file('movie'),$params);
return response()->json(['url'=>$path],200);
}
}
put を使って、第三引数でパラメータを送るようにします。
そのとき、
$params = [
'visibility' => 'public',
'Metadata' => [
'x-amz-meta-post_id' => '1'
]
];
x-amz-meta-
このプレフィックスから始まるように指定します。
これはお作法として、決まり文句であるようです。
管理画面から手動で入力しようとすると、
このようになります。
また、公式のドキュメントにもこのように書いてあります。
以上がタイトルの内容で、以下はおまけです。
なぜメタデータが必要だったか
このシステムでは、ユーザーがアップロードした動画ファイルを AWS Transcribe によって文字起こしするプロセスが組まれています。
しかし、文字起こしの結果を動画ファイルと正確に紐づけるためのユニークな ID が必要でした。
通常のファイルアップロードではこの情報を保持できないため、ファイルにメタデータとして ID を付与する方法で実装しました。
- Laravel で動画をアップロード
- サーバー上で動画ファイルから、FFMpeg により音声ファイルを作成
- 音声ファイルを S3 に保存
- S3 への保存をトリガーに Lambda を動作
- Lambda で AWS Transcribe を使用し、文字起こしファイルを S3 へ保存
- 文字起こしファイルの保存をトリガー に Lambda を動作
- Lambda で Output されたファイルパスなど DB に保存、動画ファイルの ID などと紐付け
これが正解かどうか分からないので、もしもっと良い方法があればお手数なんですが Youtube の適当な動画にコメントしていただいたり、お問い合わせにご連絡いただけると幸いです。
おわりに
知っていれば大したことはないのですが、正解を引くのに数時間かかったので参考になればと思います。
誰かの参考になれば幸いです。
フィードバックのお願い
この記事のフィードバックがありましたらYoutubeの適当な動画にコメントしていただいたり、お問い合わせからご連絡ください。