プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

【Laravel5.6】画像ファイルアップロードについてのポイントまとめ

  • 2018年7月8日
  • PHP
  • 1730view
  • 0件
PHP

Laravelで画像ファイルをアップロードし、DBに登録する処理方法についてのポイントをまとめます。
例としてuserテーブルのimageカラムにアップロードしたファイル名を登録する想定で書いていきます。

blade

bootstrapと組み合わせると以下のような感じ

<form method="post" action="file_edit" enctype="multipart/form-data">
  <div class="form-row">
    <div class="form-group col-12">
      <label class="col-sm-3 control-label" for="image">画像アップロード</label>
      <input type="file" name="image" class="form-control{{ $errors->has('image') ? ' is-invalid' : '' }}" placeholder="ファイル">
      @if ($errors->has('image'))
      <span class="invalid-feedback">
      <strong>{{ $errors->first('image') }}</strong>
      </span>
      @endif
    </div>
  </div>
<form>
ファイルを扱う場合はformタグにenctype=”multipart/form-data”を加える。
ファイル選択用のフォームを表示するのはinput type=”file”の部分。

labelとinput部分はformファサードを使っても以下のようにも書けるので、好みで。

{{Form::label('image', '画像アップロード')}}
{{-- {{ Form::file('image') }} --}}

ただし、laravel5以降は標準では使えないため、laravelcollectiveのパッケージをcomposerからインストールする必要がある。

controller

public function create(Request $request)
{
...
$path = "app/".$request->file('image')->store('public/images');
$user->image = basename($path);
...
}
$request->file(‘○○’)の部分はblade側で書いたformのname属性。
store()メソッドではディレクトリを指定していて、ここで指定したディレクトリが登録時に作成され、その中にファイルが入る。
basename($path)部分はDBにファイル名のみを入れたかった為、basename関数でファイル名のみを取得して、userテーブルのimageカラムにインサートしている。
単純に$path部分を指定すればディレクトリを含むパスが取れる。

この場合ファイル名は一意の名前が自動で命名されるが、storeAsメソッドの第二引数にファイル名を指定することができる。
同じフォームにnameインプットがあると過程して、その値をファイル名に指定するようにしたい場合は以下のようになる。
$path = “app/”.$request->file(‘image’)->storeAs(‘public/images’, $request->name);

他の設定

public/storageからstorage/app/publicにシンボリックリンクを張る

php artisan storage:link

バリデーション

ついでにバリデーションの設定も。

    public static $rules = array(
        'image' => 'required|file|dimensions:min_width=120,min_height=120,max_width=800,max_height=800',
    );
アップロードされたファイルかどうか、サイズの指定など

まとめ

ここまででファイルのアップロード→ストレージ、DBへの登録ができました。
表示に関しては別記事で書く予定ことにします。

参考にさせていただいた記事

Laravel5.4で画像をアップロードし、public/imagesに保存したい
https://teratail.com/questions/89984

Laravel5 ファイルのアップロード

Laravelで画像ファイルアップロードをする簡単なサンプル
https://qiita.com/makies/items/0684dad04a6008891d0d

Laravel 5.6 ファイルストレージ
https://readouble.com/laravel/5.6/ja/filesystem.html