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