目次
- Macのローカルで作成したLaravelアプリで画像ファイルをアプリのローカルにアップロードする方法をまとめる
実施環境
- ハードウェア環境
項目 | 情報 |
---|---|
OS | macOS Catalina(10.15.5) |
ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
プロセッサ | 2 GHz クアッドコアIntel Core i5 |
メモリ | 32 GB 3733 MHz LPDDR4 |
グラフィックス | Intel Iris Plus Graphics 1536 MB |
- ソフトウェア環境
項目 | 情報 | 備考 |
---|---|---|
PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする |
Laravel バージョン | 6.X | commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う |
MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする |
前提条件
- MacのローカルでLaravelのアプリが作成できる状態になっていること。
- コマンド
$ composer
が実行できる状態になっていること。
前提情報
- 本記事はMacのローカルで作成されたLaravelアプリから
アプリ名ディレクトリ/storage/app/public/images
にファイルをアップロードする機能を作る。 - この記事ではアップロードを最終目標としアップロードしたファイルを表示する機能は別の記事で紹介する。
- Laravelアプリを作成する部分から説明する。
- 作成するLaravelアプリは「laravel6_image」とし使用するデータベース名を「laravel6_image」とする。
- 本記事の作業完了したソースは下記にアップしてある。
概要
- データベースの作成
- Laravelアプリ作成
- .envファイルの修正とシンボリックリンクの作成
- ルーティング情報の記載
- マイグレーションファイルの記載とマイグレート
- モデルファイルの修正
- コントローラファイルの作成と記載
- ビューファイルの作成と記載
- 確認
詳細
- 下記の説明で実行するコマンドはすべてMacのローカルのターミナルで実行するものとする。
-
データベースの作成
-
下記コマンドを実行してMySQLにログインする。(MySQLのパスワードがわからなくなってしまった方はこちら→Mac ローカル環境の MySQL 8.x のrootパスワードを忘れた時のリセット方法)
$ mysql -u root -p
-
下記SQLを実行してデータベース「Laravel6_image」を作成する。
create database laravel6_image;
-
下記SQLを実行して結果に「laravel6_image」があることを確認してMySQLからログアウトする。
show databases;
-
-
Laravelアプリ作成(下記のアプリ作成実行直後のソースはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/01_create_app)
-
Laravelアプリのファイルを作成したいディレクトリで下記コマンドを実行する。
$ composer create-project "laravel/laravel=6.*" laravel6_image $ cd laravel6_image
-
-
.envファイルの修正とシンボリックリンクの作成
-
下記コマンドを実行してLaravelの設定ファイルを開く。
$ vi .env
-
下記のように内容を記載修正する。
.envAPP_NAME=laravel6_image DB_DATABASE=laravel6_image DB_USERNAME=root DB_PASSWORD=皆さんのMySQLのrootユーザのパスワード FILESYSTEM_DRIVER=public
-
記載修正した筆者の.envの内容を下記に記載する。(MySQLのrootパスワードは伏せる)
.envAPP_NAME=laravel6_image APP_ENV=local APP_KEY=base64:UCrvlsgbU4qjd5H8rRSm67u1yur1lG/dmgUYOwM49YQ= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel6_image DB_USERNAME=root DB_PASSWORD=************* FILESYSTEM_DRIVER=public BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
-
下記コマンドを実行してデフォルトマイグレーションファイルのマイグレートを実行する。
$ php artisan migrate;
-
下記コマンドを実行してシンボリックリンクの作成を行う。
$ php artisan storage:link
-
下記コマンドを実行してローカルサーバを起動する。
$ php artisan serve
-
下記にアクセスして下記画像の画面が表示されることを確認する。
-
-
ルーティング情報の記載(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/02_route)
-
下記コマンドを実行してルーティングファイルを開く。
$ vi routes/web.php
-
下記の内容を追記する。
laravel6_image/routes/web.php// 画像アップロードページ用 Route::get('/input', 'ImageController@input')->name('input'); // 画像アップロード処理用 Route::post('/upload', 'ImageController@upload')->name('upload');
-
記載後のルーティングファイルの全内容を下記に記載する。
laravel6_image/routes/web.php<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); // 下記を追記 // 画像アップロードページ用 Route::get('/input', 'ImageController@input')->name('input'); // 画像アップロード処理用 Route::post('/upload', 'ImageController@upload')->name('upload'); // 上記までを追記
-
-
マイグレーションファイルの記載とマイグレート(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/03_migrate)
-
下記コマンドを実行してモデルファイルとマイグレーションファイルを一緒に作成する。
$ php artisan make:model Models/Image -m
-
下記コマンドを実行してマイグレーションファイルを開く。(YYYY_MM_DD_XXXXXXはマイグレーションファイルの作成日時)
$ vi database/migrations/YYYY_MM_DD_XXXXXX_create_images_table.php
-
upメソッドのcreateの中に下記を記載する。
database/migrations/YYYY_MM_DD_XXXXXX_create_images_table.php$table->string('file_path')->default('default'); $table->string('file_name')->default('default'); $table->softDeletes();
-
記載後のマイグレーションファイルの全内容を下記に記載する。
database/migrations/YYYY_MM_DD_XXXXXX_create_images_table.php<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateImagesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('images', function (Blueprint $table) { $table->bigIncrements('id'); // 下記を追記 $table->string('file_path')->default('default'); $table->string('file_name')->default('default'); $table->softDeletes(); // 上記までを追記 $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('images'); } }
-
下記コマンドを実行してマイグレートする。
$ php artisan migrate
-
-
(本作業の意図はこちら→Laravel テーブル内のデータ削除を論理削除にする)(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/04_model)
-
下記コマンドを実行してモデルファイルを開く。
$ vi app/Models/Image.php
-
下記の内容を追記する。
laravel6_image/app/Model/Image.phpuse Illuminate\Database\Eloquent\SoftDeletes; // Imageクラス内に下記を追記 use SoftDeletes;
-
記載後のモデルファイルの全内容を下記に記載する。
laravel6_image/app/Models/Image.php<?php namespace App\Model; use Illuminate\Database\Eloquent\Model; // 下記を追記 use Illuminate\Database\Eloquent\SoftDeletes; class Image extends Model { //下記を追記 use SoftDeletes; }
-
-
コントローラファイルの作成と記載(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/05_controller)
-
下記コマンドを実行してコントローラファイルを作成する。
$ php artisan make:controller ImageController
-
下記コマンドを実行して作成したコントローラファイルを開く。
$ vi app/Http/Controllers/ImageController.php
-
下記のようにコントローラファイルの内容を追記・修正する。追記修正後のコントローラファイルの全体の内容を下記に記載する。(Storageファサードを使用するときにdiskを処理中で指定しているドキュメントが多くあるが.envファイルで
FILESYSTEM_DRIVER=public
を一括指定しているので本方法だと処理中にdiskメソッドで指定することはない。)laravel6_image/app/Http/Controllers/ImageController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; // 下記を追記する use App\Models\Image; use Illuminate\Support\Facades\Storage; // 上記までを追記する class ImageController extends Controller { // 下記を追記する public function input() { return view('images/input'); } public function upload(Request $request) { $this->validate($request, [ 'file' => [ // 空でないこと 'required', // アップロードされたファイルであること 'file', // 画像ファイルであること 'image', // MIMEタイプを指定 'mimes:jpeg,png', ] ]); if ($request->file('file')->isValid([])) { $file_name = $request->file('file')->getClientOriginalName(); // オリジナルファイルのファイル名の取得 $file_path = Storage::putFile('/images', $request->file('file'), 'public'); // ファイルのアップロードとアップロードパスの取得 $image_info = new Image(); $image_info->file_path = $file_path; $image_info->file_name = $file_name; $image_info->save(); return redirect('/'); }else{ return redirect(route('input')); } } // 上記までを追記する }
-
-
ビューファイルの作成と記載(本作業完了後のソースコードはこちら→)
-
下記コマンドを実行してビューファイルを格納するディレクトリを作成する。
$ mkdir -p resources/views/images
-
下記コマンドを実行してビューファイルを作成して開く。
$ vi resources/views/images/input.blade.php
-
下記の内容をビューファイルに記載する。
laravel6_image/resources/views/images/input.blade.php<h1>画像ファイルのアップロード</h1> <form action="{{route('upload')}}" method="POST" enctype="multipart/form-data"> @csrf @error('file') {{$message}} <br> @enderror <label for="photo">画像ファイル:</label> <input type="file" class="form-control" name="file"> <br> <input type="submit"> </form>
-
-
確認
-
下記コマンドを実行してローカルサーバを起動する。
$ php artisan serve
-
下記にアクセスする。
-
下記のページが表示されたことを確認する。
-
「ファイルを選択」をクリック後任意の画像ファイルを選択し「送信」をクリックする。
-
エラーが出ずhttp://127.0.0.1:8000にリダレクトされることを確認する。
-