2018/10/12

前回、必要最低限の機能だけでファイルアップロード機能のプログラムを作成しました。
今回はもう少し使えるように改良を加えます。
改修内容
バックエンド側
→ アップロードした画像パスをDBに保存
→ アップロードした画像の一覧表示
フロントエンド側
→ Bladeマスターファイルとブランチファイルの作成
→ Boostrap追加
→ グローバルメニュー追加
画面フロー
完成図
TOPで画像をアップロード
コントローラで処理されトップにリダイレクトされて一覧表示
手順
【1】画像パスをDBにいれる
1)テーブルの作成
2)モデルの作成
3)コントローラの修正
【2】一覧表示/ページャー
ビューの修正
【3】ビューファイルの整形
1)Bladeマスターファイルの作成
2)Bladeブランチファイルの作成
【1】画像パスをDBにいれる
1)テーブルの作成
DBのテーブル作成についての詳しい解説は下記のページを参照ください。
1.artisanコマンドの実行
artisanコマンドでマイグレーションファイルの自動生成。
オプションで同時にテーブル(photos)も作成します。
php artisan make:migration create_photos_table --create=photos
慣例では
テーブル名・・・複数形
モデル名・・・単数形
コントローラ名・・・複数形
になります。
2.マイグレーションファイルの編集
: (※省略)
public function up()
{
Schema::create('photos', function(Blueprint $table)
{
$table->increments('id');
$table->string('path'); //追加
$table->timestamps();
});
}
: (※省略)
3.マイグレーションファイルの実行
php artisan migrate
2)モデルの作成
モデルに関しての詳しい解説は以下のページを参照してください。
artisanコマンドでモデルを自動生成します。
php artisan make:model Photo
慣例ではモデル名はアッパーキャメル。
DBテーブル名 : photos
モデル名 : Photo
の場合は自動的にDBとモデルが連結されます。
モデルについて
3)コントローラの修正
先ほど作成したモデルのパスをコントローラに通しておきます。
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use Intervention\Image\Facades\Image; use App\Photo; //モデルのパスを追加 :(※省略)
レコードの追加に関しての詳しい解説は以下のページを参照ください。
storeメソッドにEloquentを追加します。
public function store(Request $request){
$input = $request->all();
$fileName = $input['fileName']->getClientOriginalName();
$fileName = time()."@".$fileName;
$image = Image::make($input['fileName']->getRealPath());
//画像リサイズ ※追加
$image->resize(100, null, function ($constraint) {
$constraint->aspectRatio();
});
$image->save(public_path() . '/images/' . $fileName);
$path = '/images/' . $fileName;
//↓ 追加 ↓
$photo = new Photo();
$photo->path = 'images/' . $fileName;
$photo->save();
return redirect('/photos/')->with('status', 'ファイルアップロードの処理完了!');
}
【2】一覧表示/ページャー
配列で受け取りそのままビュー画面に渡します。
public function index()
{
$photo = Photo::latest('created_at')->paginate(10);
return View('photos.create')->with('photos',$photo);
}
ビュー画面で配列データをループ処理
@foreach ($photos as $photo)
<div class="panel panel-default">
<div class="panel-heading">アップロードした日付:{{$photo->created_at}}</div>
<!-- List group -->
<ul class="list-group">
<li class="list-group-item"><img src="{{$photo->path}}"></li>
</ul>
</div>
@endforeach
【3】ビューファイルの整形
このままだとちょっとそっけないのでビュー画面を整形します。
1)Bladeマスターファイルの作成
Bladeのマスターファイルを作成します。
BootstrapをCDNで読み込みます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>@yield('title')</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<!-- オプションのテーマ -->
<style>
:(※省略)
</style>
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/photos/create">ファイルアップロード機能</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container" style="margin-top: 30px;">
<h2>@yield('title')</h2>
@yield('content')
</div><!-- /container -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
</html>
2)Bladeブランチファイルの作成
@extends('layouts.default_photo')
@section('title', 'ファイルアップロード機能')
@section('content')
@if (session('status'))
<div class="alert alert-success" role="alert" onclick="this.classList.add('hidden')">{{ session('status') }}</div>
@endif
{!! Form::open(['url' => 'photos/store', 'files' => true,'method' => 'post']) !!}
{!! Form::label('fileName', 'アップロード') !!}
{!! Form::file('fileName') !!}
{!! Form::submit('アップロードする') !!}
{!! Form::close() !!}
<hr color="#000000" style="height:1px;">
@foreach ($photos as $photo)
<div class="panel panel-default">
<div class="panel-heading">アップロードした日付:{{$photo->created_at}}</div>
<!-- List group -->
<ul class="list-group">
<li class="list-group-item"><img src="{{$photo->path}}"></li>
</ul>
</div>
@endforeach
@endsection
以上で画像アップロード機能のプログラムが完成です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。


