弊社サービスでは、ユーザーのアップロードしたファイル群を Amazon S3 に保管しています。
元々は自社サーバに保存していたのですが、とある仕事でAWSに縁があり、なんやかんやあってS3使おうぜ!ということになりました。
ある日の開発者は思います。
「ファイルの保存先フォルダをユーザーごとに分けたいなぁ」
「そのためには動的にフォルダを生成する必要があるなぁ」
「あれ?いちいちS3にフォルダの存在確認したりフォルダ生成したりする必要があるんじゃ……? 」
うっわこれめんどいやつっぽいぞ
……と、既存の実装からイメージして勝手にうわぁと思っていたのですが、調べてみると、どうやらそうでもなさそうなんですよね。
S3 バケット内でフォルダを使用する方法 – Amazon Simple Storage Service
なるほどね。
つまるところ、実務上の要点は以下のようです。
- S3はフラットな構造であり、内部的に階層はない。(=いわゆるディレクトリは実在しない)
- 利便性のためにフォルダという概念をサポートしており、UI上ではフォルダ構造があるように見せている。
- ファイルをアップロードする際、ファイル名に区切り文字
/
を含ませれば、自動的に階層構造として処理される……?
3つ目。怪しいですね。確認しましょう。
例えば、アップロードする際のファイル名を、以下のように記述したとします。
'file_name' => 'user_image/' . $user_id . '/' . $file_name
このとき、file_name
は user_image/0123/hogehoge.png
のようになります。
さて、アップロードを実行してみましょう……
やったぜ
問題なくアップロードされましたね。
フォルダの階層構造も意図したとおりに表現されています。
この結果から、S3にファイルをアップロードする際、フォルダを作ってファイルを整理したい~といった場合には、特にフォルダの作成とかについて考える必要はないことがわかりました。楽ちん。
おさらい
- S3はフラットな構造であり、内部的に階層はない。(=いわゆるディレクトリは実在しない)
- 利便性のためにフォルダという概念をサポートしており、UI上ではフォルダ構造があるように見せている。
- ファイルをアップロードする際、ファイル名に区切り文字
/
を含ませれば、自動的に階層構造として処理される