概要
フォームからアップロードされたファイルをサーバーの場所を指定して保存する手順について整理する。
フォームから取得したUploadedFileオブジェクトを介して、一時保存されたファイルの実体を、store()メソッドやstoreAs()メソッドで所定の場所に保存する。
ファイル取得
ここでは画像ファイルのアップロードを題材とし、アップロードファイルのUploadedFileオブジェクトを取得済みとする。
ファイル保存の流れ
フォームでファイルを選択・アップロードし、それをサーバーに保存する流れは以下の通り。
- フォームのname属性値からUploadedFileオブジェクトを取得
- store()メソッドや- storeAs()メソッドで保存
- メソッドの戻り値から、保存されたファイルのパスを取得
- パスをデータベースに保存するなどの処理を実行
実装例
アップロードファイル取得のコード中、storeアクションの内容を以下の様に書き換える。ここでは得られたファイルパスを表示させて、そこで実行を停止している。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class ImageController extends Controller {     ........     public function store(ImageRequest $request) {         // 一時保存されたUploadedFileの取得         $image = $request->file('image');         // ファイルの保存と保存されたファイルのパス取得         $path = '';         if (isset($image)) {             $path = $image->store('');         }         dd($path);     }     ........ } | 
store()/storeAs()
UploadedFile::store()メソッド
標準形
| 1 | パス文字列 = [UploadedFileのインスタンス]->store('ディレクトリー', 'ディスク'); | 
- 引数にファイルを保存するディレクトリーとディスクを指定する
 →省略不可
- 指定した場所にアップロードファイルが保存される
- 戻り値として、ランダム文字列化されたファイル名を含むパスが返される
引数が''の場合
- 引数を”とすると、アップロードファイルはstorage/app直下に保存される
 →デフォルトのdiskはstorage/appに設定されている
| 1 2 3 4 5 |         // ファイルの保存と保存されたファイルのパス取得         $path = '';         if (isset($image)) {             $path = $image->store('');         } | 
ファイルパスの内容。
| 1 | "HEwMbd1eE53Gmgq8SSUa4KCKl5GoJSSVfRw1W6rS.jpg" | 
保存されたファイルの確認。
| 1 2 | $ ls storage/app HEwMbd1eE53Gmgq8SSUa4KCKl5GoJSSVfRw1W6rS.jpgひ | 
引数にディレクトリーを指定
ここでは引数に'test'というディレクトリーを指定している。
| 1 2 3 4 5 |         // ファイルの保存と保存されたファイルのパス取得         $path = '';         if (isset($image)) {             $path = $image->store('test');         } | 
戻り値のパスは、testディレクトリー下にファイルが位置している。
| 1 | "test/GvZKLW48CBEZCP7441pQyxCfuNWF6WlKL6u8teSF.jpg" | 
storage/appの下にtestディレクトリーが存在すればその下に、存在しなければ新たにtestディレクトリーが作成されてその下にファイルが保存される。
| 1 2 | $ ls storage/app/test/ GvZKLW48CBEZCP7441pQyxCfuNWF6WlKL6u8teSF.jpg | 
第2引数にディスクを指定
以下の例では、store()の第2引数に'public'を指定している。filesystems.phpでのpublicディスクの定義から、この場合のアップロードファイルはstorage/app/public下のtestディレクトリーの下に保存される。
store('ディスク内のディレクトリー', 'ディスク');
| 1 2 3 4 5 6 |         // ファイルの保存と保存されたファイルのパス取得         $path = '';         if (isset($image)) {             $path = $image->store('test', 'public');         }         dd($path); | 
戻り値のパス。ディスク内のtestディレクトリーに続いてランダム文字列でファイル名が生成されている。
| 1 | "<span class="sf-dump-str" title="49 characters">test/eGjEzTioHRgClfYIXIbjQ7kvwCgqjRjp4pRRjI6o.jpg</span>" | 
確認すると、確かにstorage/app/public/testの下にファイルが保存されている。なおtestディレクトリーが存在しないときは、新たに作成される。
| 1 2 | $ ls storage/app/public/test/ eGjEzTioHRgClfYIXIbjQ7kvwCgqjRjp4pRRjI6o.jpg | 
UploadedFile::storeAs()メソッド
store()メソッドはアップロードファイルに新たにランダム文字列でファイル名をつけるが、特定の名前を与えて保存したいときにはstoreAs()メソッドを使う。使い方や戻り値はstore()と同じ。
| 1 | storeAs('ディスク内のディレクトリー', 'ファイル名', 'ディスク'); | 
第3引数は省略可能で、その場合はstore()で第2引数を省略した時と同じ場所にファイルが保存される。
以下の例ではpublicディスクを指定しているが、その場所はfilesystems.phpでstorage/app/publicと定義されている。
| 1 2 3 4 5 |         $path = '';         if (isset($image)) {             $path = $image->storeAs('test', 'specific_name.jpg', 'public');         }         dd($path); | 
戻り値のファイルパス。ディレクトリーの後に指定したファイル名が続いている。
| 1 | "test/specific_name.jpg" | 
指定された場所にファイルが保存されているのが確認できる。
| 1 2 | $ ls storage/app/public/test/ specific_name.jpg | 
ファイルのパスのデータベース登録
store()/storeAs()の戻り値で得られたパスをデータベースに保存することで、画像表示などに活用できる。
具体的には、以下の例の様にパス名を登録するカラムにstore()の戻り値がセットされた$pathの内容を登録する。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class ImageController extends Controller {     ........     public function store(ImageRequest $request) {         // 一時保存されたUploadedFileの取得         $image = $request->file('image');         // ファイルの保存と保存されたファイルのパス取得         $path = '';         if (isset($image)) {             $path = $image->store('');         }         // データベース登録         Image::create([             'image' => $path;         ]);     }     ........ } |