0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravel ローカルに画像をアップロードするアプリを作成する

Last updated at Posted at 2020-11-04

目次

  • 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」とする。
  • 本記事の作業完了したソースは下記にアップしてある。

概要

  1. データベースの作成
  2. Laravelアプリ作成
  3. .envファイルの修正とシンボリックリンクの作成
  4. ルーティング情報の記載
  5. マイグレーションファイルの記載とマイグレート
  6. モデルファイルの修正
  7. コントローラファイルの作成と記載
  8. ビューファイルの作成と記載
  9. 確認

詳細

  • 下記の説明で実行するコマンドはすべてMacのローカルのターミナルで実行するものとする。
  1. データベースの作成

    1. 下記コマンドを実行してMySQLにログインする。(MySQLのパスワードがわからなくなってしまった方はこちら→Mac ローカル環境の MySQL 8.x のrootパスワードを忘れた時のリセット方法

      $ mysql -u root -p
      
    2. 下記SQLを実行してデータベース「Laravel6_image」を作成する。

      create database laravel6_image;
      
    3. 下記SQLを実行して結果に「laravel6_image」があることを確認してMySQLからログアウトする。

      show databases;
      
  2. Laravelアプリ作成(下記のアプリ作成実行直後のソースはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/01_create_app

    1. Laravelアプリのファイルを作成したいディレクトリで下記コマンドを実行する。

      $ composer create-project "laravel/laravel=6.*" laravel6_image
      $ cd laravel6_image
      
  3. .envファイルの修正とシンボリックリンクの作成

    1. 下記コマンドを実行してLaravelの設定ファイルを開く。

      $ vi .env
      
    2. 下記のように内容を記載修正する。

      .env
      APP_NAME=laravel6_image
      
      DB_DATABASE=laravel6_image
      DB_USERNAME=root
      DB_PASSWORD=皆さんのMySQLのrootユーザのパスワード
      
      FILESYSTEM_DRIVER=public
      
    3. 記載修正した筆者の.envの内容を下記に記載する。(MySQLのrootパスワードは伏せる)

      .env
      APP_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}"
      
    4. 下記コマンドを実行してデフォルトマイグレーションファイルのマイグレートを実行する。

      $ php artisan migrate;
      
    5. 下記コマンドを実行してシンボリックリンクの作成を行う。

      $ php artisan storage:link
      
    6. 下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve
      
    7. 下記にアクセスして下記画像の画面が表示されることを確認する。

  4. ルーティング情報の記載(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/02_route

    1. 下記コマンドを実行してルーティングファイルを開く。

      $ vi routes/web.php
      
    2. 下記の内容を追記する。

      laravel6_image/routes/web.php
      // 画像アップロードページ用
      Route::get('/input', 'ImageController@input')->name('input');
      
      // 画像アップロード処理用
      Route::post('/upload', 'ImageController@upload')->name('upload');
      
    3. 記載後のルーティングファイルの全内容を下記に記載する。

      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');
      // 上記までを追記
      
  5. マイグレーションファイルの記載とマイグレート(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/03_migrate

    1. 下記コマンドを実行してモデルファイルとマイグレーションファイルを一緒に作成する。

      $ php artisan make:model Models/Image -m
      
    2. 下記コマンドを実行してマイグレーションファイルを開く。(YYYY_MM_DD_XXXXXXはマイグレーションファイルの作成日時)

      $ vi database/migrations/YYYY_MM_DD_XXXXXX_create_images_table.php
      
    3. 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();
      
    4. 記載後のマイグレーションファイルの全内容を下記に記載する。

      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');
          }
      }
      
      
    5. 下記コマンドを実行してマイグレートする。

      $ php artisan migrate
      
  6. (本作業の意図はこちら→Laravel テーブル内のデータ削除を論理削除にする)(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/04_model

    1. 下記コマンドを実行してモデルファイルを開く。

      $ vi app/Models/Image.php
      
    2. 下記の内容を追記する。

      laravel6_image/app/Model/Image.php
      use Illuminate\Database\Eloquent\SoftDeletes;
      // Imageクラス内に下記を追記
      use SoftDeletes;
      
    3. 記載後のモデルファイルの全内容を下記に記載する。

      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;
      }
      
  7. コントローラファイルの作成と記載(本作業完了後のソースコードはこちら→https://github.com/miriwo0104/laravel6_image/tree/image_upload_local/05_controller

    1. 下記コマンドを実行してコントローラファイルを作成する。

      $ php artisan make:controller ImageController
      
    2. 下記コマンドを実行して作成したコントローラファイルを開く。

      $ vi app/Http/Controllers/ImageController.php
      
    3. 下記のようにコントローラファイルの内容を追記・修正する。追記修正後のコントローラファイルの全体の内容を下記に記載する。(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'));
              }
      
          }
          // 上記までを追記する
      }
      
  8. ビューファイルの作成と記載(本作業完了後のソースコードはこちら→

    1. 下記コマンドを実行してビューファイルを格納するディレクトリを作成する。

      $ mkdir -p resources/views/images
      
    2. 下記コマンドを実行してビューファイルを作成して開く。

      $ vi resources/views/images/input.blade.php
      
    3. 下記の内容をビューファイルに記載する。

      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>
      
  9. 確認

    1. 下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve 
      
    2. 下記にアクセスする。

    3. 下記のページが表示されたことを確認する。

      127_0_0_1_8000_input.png

    4. 「ファイルを選択」をクリック後任意の画像ファイルを選択し「送信」をクリックする。

      127_0_0_1_8000_input.png

    5. エラーが出ずhttp://127.0.0.1:8000にリダレクトされることを確認する。

      Laravel.png

参考文献

0
1
1

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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?