ホーム > Laravel > 【Laravel+S3】保存時にユーザー定義のmetadataを保存する方法
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-

このプレフィックスから始まるように指定します。

これはお作法として、決まり文句であるようです。

管理画面から手動で入力しようとすると、

image36

このようになります。

また、公式のドキュメントにもこのように書いてあります。

以上がタイトルの内容で、以下はおまけです。

なぜメタデータが必要だったか

このシステムでは、ユーザーがアップロードした動画ファイルを AWS Transcribe によって文字起こしするプロセスが組まれています。

しかし、文字起こしの結果を動画ファイルと正確に紐づけるためのユニークな ID が必要でした。

通常のファイルアップロードではこの情報を保持できないため、ファイルにメタデータとして ID を付与する方法で実装しました。

  1. Laravel で動画をアップロード
  2. サーバー上で動画ファイルから、FFMpeg により音声ファイルを作成
  3. 音声ファイルを S3 に保存
  4. S3 への保存をトリガーに Lambda を動作
  5. Lambda で AWS Transcribe を使用し、文字起こしファイルを S3 へ保存
  6. 文字起こしファイルの保存をトリガーに Lambda を動作
  7. Lambda で Output されたファイルパスなど DB に保存、動画ファイルの ID などと紐付け

これが正解かどうか分からないので、もしもっと良い方法があればお手数なんですが Youtube の適当な動画にコメントしていただいたり、お問い合わせにご連絡いただけると幸いです。

おわりに

知っていれば大したことはないのですが、正解を引くのに数時間かかったので参考になればと思います。

誰かの参考になれば幸いです。

フィードバックのお願い
この記事のフィードバックがありましたらYoutubeの適当な動画にコメントしていただいたり、お問い合わせからご連絡ください。