Laravelでアップロード画像を自動リサイズする


やること

ユーザーがプロフィール画像をアップロードした際に正方形に自動整形するよう設定します。

途中で発生したエラーの対処法も残しています。

環境

  • mac OS Catalina 10.15.6
  • Docker version 19.03.12, build 48a66213fe
  • Docker Image php:7.3-fpm-alpine
  • Laravel 7.22.4

方法

Laravelで使いやすいと言われているIntervention Imageという画像処理ツールを使います。

Intervention Image

1. Intervention Imageを公式サイト通りに導入

  • インストール
terminal
        $ php composer.phar require intervention/image
  • config/app.phpでプロバイダーとエイリアス設定

    providers部分に一行追加します。

    config/app.php
        'providers' => [ 
                Intervention\Image\ImageServiceProvider::class, //追加
            ],
    

    aliases部分に一行追加します。

    config/app.php
        'aliases' => [
                'Image' => Intervention\Image\Facades\Image::class, //追加
            ],
    

2. コントローラーに記述

  • 画像がアップロードされた際に300*300pixelにリサイズされるように設定します。

    わかりやすい使い方はこちらが参考になると思います。

    完全網羅!Intervention Image(PHP)で画像を編集する全実例

    UserController.php
        use Intervention\Image\ImageManagerStatic as Image; //追加します。
    
        public function update(Request $request, $userName)
            {
                $user = User::where('name', $userName)->first();
                if ($request->image) {
                    $filePath = $request->file('image');
                    Image::make($filePath)->fit(300, 300)->save($filePath); //ファイルを読み込んでリサイズ、上書き保存しています。
                    $filePath = $filePath->store('images/profile');
                }
                $user->save();
    
                return redirect('/profile/' . $userName);
            }
    

    これでスムーズに行けば完了ですが、エラーが出たので以下はその対処法です。

3. エラー対処

  • エラーメッセージ

        Intervention\Image\Exception\NotSupportedException
        GD Library extension not available with this PHP installation.
    

    GDライブラリという画像処理のライブラリが無いようなので導入します。

    Docker環境でAlpine Linuxという軽量リナックスのコンテナでの方法です。

    Dockerfile
        FROM php:7.3-fpm-alpine
        LABEL maintainer "hiro"
    
        ENV COMPOSER_HOME /composer
    
        RUN set -eux && \
          # Intervention Image時に必要なパッケージ 以下3行追加
          apk add --no-cache libpng libpng-dev libjpeg-turbo-dev freetype-dev && \
          docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \
          docker-php-ext-install -j$(nproc) gd && \
    

    更新してビルドしましたが、他にも足りないものがエラー出たのでlibjpeg-turbo-devfreetype-devを追加で導入しました。

    同じ環境でもし

       configure: error: jpeglib.h not found.
    

    のようにパッケージが足りずにビルドできない場合は、こちらで名前検索をかけると必要なパッケージが見つかるはずです。

    Alpine Linux packages