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