Laravel – アップロード画像処理

概要

ユーザーのプロフィール画像や商品画像をアップロードし、ユーザーデータや商品データに関連付けて保存・更新・削除する。

ファイルへのパスをデータベースに保存し、ファイル本体はサーバーに保存する。

準備

仕様

全体仕様は以下の通り。

  • 商品管理を扱う
  • 商品データは商品名、商品価格と商品画像で、入力フォームで入力/選択
  • 入力データはデータベースに保存
    • DBには商品名と画像ファイルへのパスを登録
  • 登録結果はindexページで一覧表示され、そのページに入力フォームも組み込む
    • 画像未登録の場合はプレースホルダー画像を表示
  • 各商品に商品名と画像、更新ボタン・商品削除ボタンを備える
  • 更新ボタンを押すと更新ページに遷移
    • 更新ページでは対象商品の商品名・現在の画像、商品名入力要素・画像選択要素、更新実行ボタンを表示
    • 更新実行ボタンを押すと編集後の内容でデータを更新し、画像が選択されていれば商品画像を変更
  • 商品削除ボタンを押すと画像と商品データを削除

モデルとコントローラーの作成

ルーティング

ルーティングはリソースベースとし、createshow以外の全てを設定。

自動設定されるルーティング。

マイグレーション

マイグレーションファイルの編集

商品名、価格、画像ファイルへのパスのカラムを追加し、日付は2038問題対応datetime型に変更。

マイグレーション

マイグレーションを実行。

アップロード画像処理の実装

実装の流れ

準備ができたアプリケーションに対して、以下の順番でアップロード画像処理を実装していく。

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

入力・アップロード

入力・アップロードでは以下のことを整理する。

  • 画像ファイルの選択を含む入力フォーム
  • 画像ファイル選択要素のバリデーション

処理の流れは以下のとおり。

  1. 画像ファイルを選択してフォームの送信ボタンを押す
  2. ファイル本体がアップロードされ、サーバーの一時保存領域に保存される
  3. アップロードファイルのインスタンスがリクエストから取得可能となる

要点は以下の通り。

  • form要素のオプションにenctype="multipart/form-data"を加える
  • input要素のオプションでtype="file"とする
  • 画像ファイルに関するバリデーションルールは、['file', 'mimes=jpeg,jpg,png', ...]など

詳細はアップロード画像 – 入力を参照。

アップロード画像の保存・登録

アップロード画像の保存・登録では以下のことを整理する。

  • storeルートによるデータ保存
  • リクエストからの画像インスタンスの取得
  • 画像ファイルの公開エリアへの保存
  • 画像ファイルへのパスのデータベース登録

処理の流れは以下の通り。

  1. 画像ファイルのインスタンスをリクエストから取得
    • たとえば$image = $request->image
  2. 画像ファイルの保存とパスの取得
    • $path = $image->store('ディレクトリー', 'ディスク')
    • ただしフォームで画像ファイルが選択されているときだけ処理する
  3. 画像ファイルへのパスのデータベース登録
    • create([..., $image => $path, ...])

詳細はアップロード画像 – 登録・保存を参照。

アップロード画像の表示

画像の表示では以下のことを整理する。

  • 画像ファイルが保存されたpublicディスクのシンボリックリンクの作成
  • 画像ファイルへのパスを含むデータの取得
  • パスを介した画像ファイルの表示

要点は以下の通り。

  • 画像ファイルを保存しているpublicディスクはstorage/app/publicディレクトリーに充てられているが、Web上は非公開
  • このpublicディスクへのシンボリックリンクを、アプリケーションのpublicディレクトリーに作成
    • php artisan storage:link
  • コントローラーで画像ファイルへのパスを含むデータをデータベースから取得
    • $items = Item::all();
  • データを1つずつ取り出しながら、ビューのimg要素で画像ファイルを表示
    • <img src="{{ \Storage::url($item->image) }}">

詳細はアップロード画像の表示を参照。

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

画像の変更・削除機能では以下のことを整理する。

  • editupdateルートによるデータの編集と更新
  • destroyルートによるデータの削除
  • ディスクに保存された画像ファイルの削除
  • データ編集と編集内容によるデータ更新
  • ファイルとデータの削除

要点は以下のとおり。

  • ディスクに保存されたファイルの削除方法
    • \Storage::disk('ディスク')->delete('ファイルパス')

詳細はアップロード画像の変更・削除を参照。

 

コメントを残す

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