0
0

More than 3 years have passed since last update.

【Laravel】画像を編集してDBとローカルに登録する

Last updated at Posted at 2020-04-18

やりたいこと

  • laravelでユーザーが画像を登録する際に自動的にリサイズして保存される
  • データベースとローカルファイルに同時に保存する
  • シンボリックリンクを張り画像表示できるようにする
  • Intervention Imageを使う

前提

  • データベースは作成済み
  • Userモデルは定義済み

進めかた

  • Intervention Imageのインストール
  • Controllerの作成
  • viewの作成
  • シンボリックリンクを張る

Intervention Imageをインストールする

コマンドでプロジェクトディレクトリに移動してから

$ composer require intervention/image

Laravel構成ファイルconfig/app.phpを開き、次の行を追加します。

config/app.php
'providers' => [
    // ~~~~ 省略 ~~~~
    Intervention\Image\ImageServiceProvider::class
]
config/app.php
'aliases' => [
    // ~~~~ 省略 ~~~~
    'Image' => Intervention\Image\Facades\Image::class
]

詳しくはIntervention Imageで。

Controllerの作成

UserController.php
//useを忘れずに
use Intervention\Image\Facades\Image;


 public function add(Request $request){
        return view('user.add');
    }
    public function create(Request $request){
        //Userモデルに記載した$rulesでvalidateする
        $this->validate($request, User::$rules);
        $user = new User;
        //フォームから送られてきたプロパティをすべて取得し$formに代入
        $form = $request->all();
        //全てのプロパティを取得すると必要のない_tokenプロパティまで取得してしまうのでunsetメソッドで削除
        unset($form['_token']);
        //Userモデルをインスタンス化した$userにfill($form)でデータベースに保存
        $user->fill($form)->save();
    //ファイルのプロパティを取得し$imageに代入
        $image = $request->file('user_image');
        $width = 500;
        //$imageを幅500×縦自動で画像のアスペクト比を保ちながらリサイズしてローカルファイルに保存
        Image::make($image)->resize($width, null,function($constraint){$constraint->aspectRatio();})
        ->save( public_path('/storage/images/'.$form['user_image']));
        //ファイル名をユーザーID.jpgにしてデータベースに上書き
        $user->fill(['user_image'=>$user->id.'.jpg'])->save();
     
        return redirect('/user');

    }

Viewの作成

user.blade.php
<div class="container-fluid">
    //ファイルを登録する時はenctype="multipart/form-datを忘れずに
    <form action="{{ url('/') }}/user/add" method="post"  class="form-horizontal" enctype="multipart/form-data">
    @csrf
        <div class="form-group">
            {{Form::label('user_image','画像:',['class'=>'control-label col-sm-3'])}}
            <div class="col-sm-6">
                {{Form::file('user_image', old('user_image') ,['class'=>'form-control input-lg'])}}
            </div>
        </div>
        <button type="submit" class="btn btn-primary btn-lg  center-block" >登録</button>
    </form>

シンボリックリンクを張る

laravelでは基本的にファイルなどは非公開の場所に保存されます(storage/app/public)。
ブラウザからアクセスできるのは基本的に(デフォルトでは)/publicディレクトリです。
そこでWEBに公開できる場所に(ブラウザからアクセスできる)ショートカットできる機能を作成する必要があります。
詳しくはドキュメントで。

コマンドでプロジェクトディレクトリに移動してから

$ php artisan storage:link

以上です

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0