ファイル削除の流れ
Storage
ファサードでファイルを保存したディスクを指定して、delete()
メソッドの引数にファイルパスを渡して削除を実行。
1 |
\Storage::disk('ディスク')->delete('ファイルパス'); |
- ディスクは保存時と同じものを指定
- ファイルパスは保存時に
store()
で得られた戻り値、データベースに登録しているパスをそのまま使う。
実装例
ビュー
storage
に保存したファイルのURLで使ったビューに、画像削除のフォームとボタンを追加する。
- ファイルが保存されパスがセットされていれば、
hidden
属性のinput
要素でそのパスを渡している - 画像削除ボタンを押すと
/images/delete
へルーティング
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<!DOCTYPE html> <html lang="ja" dir="ltr"> <head> <meta charset="utf-8"> <title>画像選択</title> </head> <body> <h1>画像選択</h1> <form method="post" action="{{ route('images.store') }}" enctype="multipart/form-data"> @csrf <input type="file" name="image"> <input type="submit" value="登録"> </form> {{-- バリデーションエラー表示 --}} @foreach ($errors->all() as $error) <p>{{ $error }}</p> @endforeach {{-- 画像ファイルのURLと画像を表示 --}} @isset ($path) <p>{{ $path }}</p> <p>{{ asset('storage/' . $path) }}</p> <p>{{ url('storage/' . $path) }}</p> <p>{{ \Storage::url($path) }}</p> <img src="{{ asset('storage/' . $path) }}"> <img src="{{ url('storage/' . $path) }}"> <img src="{{ \Storage::url($path) }}"> @else <p>ファイルはアップロードされていません</p> @endisset {{-- 画像を削除 --}} <form method="post" action="/images/delete"> @csrf <input type="hidden" name="path" value="{{ isset($path) ? $path : '' }}"> <input type="submit" value="画像削除"> </form> </body> </html> |
ルーティング
ルーティングは以下のように設定。リソースベースだとURLにidを含めなければならないので、ここでは別途設定し、destroy
アクションにルーティングしている。
1 |
Route::post('/images/delete', 'ImageController@destroy'); |
コントローラー
storage
に保存したファイルのURLで使ったコントローラーに、destroy
アクションを追加する。
- フォームの
hidden
属性のinput
要素からパスを取得 - パスがセットされていれば削除を実行
index
ページにリダイレクト
1 2 3 4 5 6 7 8 9 10 11 12 |
class ImageController extends Controller { ........ public function destroy(ImageRequest $request) { $path = $request->path; if (isset($path)) { \Storage::disk('public')->delete($path); } return redirect()->route('images.index'); } } |