Laravel – アップロード画像の変更・削除

概要

公開領域のディスクに保存された画像ファイルを変更・削除する手順を整理する。

  1. アップロード画像処理~準備
  2. 画像ファイルの入力
  3. アップロード画像ファイルの保存・登録
  4. アップロード画像の表示
  5. アップロード画像の変更・削除

変更は現在のファイルを削除して新しいファイルを保存するので、画像ファイルの削除手順がキーになる。

一般的なアップロードファイルの削除はこちらを参照。

ファイルの削除手順

storageディレクトリーのディスクに保存された画像ファイルの削除は、以下で行う。

ここで'ディスク''ファイルパス'は、保存・登録store()メソッドの引数に指定したものと同じ。

データの変更

例題のアプリケーションを、画像ファイルのほか、商品名や価格も併せて変更できるように修正する。

ルーティング

  • 画像データの編集は、GETメソッドでeditアクションにルーティングされる。
  • 編集されたデータの更新登録は、PATCHメソッドでupdateアクションにルーティングされる。

ビューからのリンク~index.blade.php

indexページで一覧された各商品に、編集のリンクを配置する。要点としては、

  • a要素のhrefの遷移先でroute('items.edit', $item)をしている
  • 第1引数はeditのルート名、第2引数は編集対象のデータインスタンス
  • GETのURLは以下の様に展開される
    • アプリケーションルート/{$id}/edit

コントローラー~edit

GETメソッドでルーティングされたeditアクションでは、URLに含まれる$idに対応するインスタンス$itemがデータベースから引数として渡され、このインスタンスをそのままeditビューに渡している。

ビュー~edit.blade.php

editビューでは渡された$itemインスタンスの内容を各input要素に表示し、画像ファイルのパスから画像を表示している。

  • 画像を扱うため、formenctypeオプションを指定している
  • form要素で指定できるメソッドはGETPOSTだけだが、updateルートはPATCHメソッドを期待しているので、@methodディレクティブで'patch'を指定している
  • 新規入力時と同じく、フォームリクエストで編集時の入力バリデーションを行っている

コントローラー~update

PATCHメソッドでルーティングされたupdateアクションでは、編集入力内容によって、商品データの内容と画像ファイルを更新している。

  • 編集時に画像が選択されていれば、現在のファイルを削除して、選択されたファイルを保存
    • このときにファイルのパスも取得
  • 商品内容、画像ファイルへのパスでデータの内容を更新

データの削除

ルーティング

indexページで一覧表示された商品の削除ボタンを押すと、DELETEメソッドでdestroyにルーティングされる。

ビューへの削除ボタン配置~index.blade.php

indexページの各商品表示にフォームと削除ボタンを加える。

  • form要素ではmethod="post"を指定し、@methodディレクティブで'delete'メソッドを指定している
  • 削除する商品を指定してdestroyにルーティングするだけなので、フォームにはsubmitボタンだけが配置されている

コントローラー~destroy

destroyアクションでは、ファイルが登録されていればpublicディスクから削除し、商品データをデータベースから削除している。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です