スクリーンショット_2018-12-01_19

Laravelで画像を投稿する方法

intervention/image ライブラリを使って画像を投稿する方法について書いていきます。

ライブラリのインストールと設定

intervention/imageを使うのでまずは、コマンドでインストールをします。

$ composer require intervention/image

そして、config/app.phpの
providers の中に 'Intervention\Image\ImageServiceProvider' を追加
aliases の中に 'Image' => 'Intervention\Image\Facades\Image' を追加
します。

 'providers' => [

        .......................................
        .......................................
     .......................................


       'Intervention\Image\ImageServiceProvider'
       
    ],

 'aliases' => [

        .......................................
        .......................................
        .......................................

        'Image' => 'Intervention\Image\Facades\Image'

    ],


モデルとマイグレーションの作成

コマンドでデータベースのファイルを作ります。

$ touch database/database.sqlite

コマンドでモデルとマイグレーションを作ります。

$ php artisan make:model Post -m

マイグレーションに $table->string['image']; を追加します。

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('image');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

コマンドで実行

$ php artisan migrate


コントローラーの作成

コマンドでコントローラを作ります。

$ php artisan make:controller PostController

PostController に以下のようになります。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Intervention\Image\ImageManagerStatic as Image;
use App\Post;

class PostController extends Controller
{
    public function index(){
      $image=Post::all();

      return view('index',compact('image'));
    }

    public function store(Request $request){
      $request->validate([
         'image'=>'required|image|mimes:jpg,jpeg,png|max:2000'
     ]);

     $file=$request->file('image');
     $fileName=str_random(20).'.'.$file->getClientOriginalExtension();
     Image::make($file)->save(public_path('images/'.$fileName));
     $post=new Post;
     $post->image=$fileName;
     $post->save();

     return redirect()->back();
    }
}

compact('image') は、['image'=>$image] と意味は同じです。

バリデーションは max:2000 としてますが、php.ini の設定をいじっていない場合は2MB しか最大でアップロードできないので、あんまりたいして変わんないです。


imagesフォルダの作成

Image::make($file)->save(public_path('images/'.$fileName)); の public_path は public に繋げられるので、public 直下に images フォルダを作っておきます。そうすると、 public_path('images/'.$fileName) で public/images 内に画像が保存されます。


web.phpに追加

web.php に以下のコードを追加します。

Route::get('/index','PostController@index')->name('index');

Route::post('/store','PostController@store')->name('store');


ビューの作成

resources/views の中に index.blade.php を作り、コード以下のようにします。

<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Laravel</title>

    </head>
    <body>

    <div class="image">
      @foreach($image as $i)
      @if($i!=null)
      <img src="/images/{{$i->image}}">
      @endif
      @endforeach
    </div>

    <div class="form">

      @if(count($errors)>0)
      <div class="alert alert-danger">
      <ul>
          @foreach($errors->all() as $error)
          <li>{{$error}}</li>
          @endforeach
          </ul>
      </div>
      @endif

      <form action="{{route('store')}}" method="post" enctype="multipart/form-data">
        {{ csrf_field() }}
        <input type="file" name="image">
        <br>
        <input type="submit" value="保存">
      </form>

    </div>

    </body>
</html>

<style>
img{
  width:30%;
  height:30%;
  margin-left:33%;
  margin-top:50px;
}
.form{
  margin:7% 33% ;
}
</style>


完成

このように画像が出てきたら成功です。


終わり

簡単にLaravel の intervention/image ライブラリを使って画像投稿をしてみました。

今回は2MB までの画像しか投稿できなかったですが、上に書いたように php.ini の設定をすれば、もっと大きいサイズの画像を投稿できるようになります。

画像をコントローラー内で、resize なども使って投稿された画像を調節することも出来ますが、個人的にあまり好きじゃないのでやりませんでした。

今度はphp.ini を設定して、今回よりも大きいサイズの画像のアップロードできるようにするやり方を、次は書いてみようと思ったり思わなかったり....... 。