概要
フォームからアップロードされたファイルをサーバーの場所を指定して保存する手順について整理する。
フォームから取得した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; ]); } ........ } |