のぐそんブログ

暗いおじさんがシコシコ書くブログです。

LaravelでS3に画像をアップロードする為のメモ

Laravelで、S3に画像をアップロードする為のメモです。

.envファイルを変更

以下の情報を追加する。

AWS_KEY=[アクセスキー]
AWS_SECRET=[シークレットキー]
AWS_REGION=[リージョン(東京ならap-northeast-1)]
AWS_BUCKET=[バケット名]

変更した情報はconfig/filesystems.phpで利用されます。

    'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],

        's3' => [
            'driver' => 's3',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
        ],

    ],

AWS_DEFAULT_REGION

リージョンコードを調べる。
アジアパシフィック (東京)はap-northeast-1

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html

AWS_BUCKET

S3のバケット名を利用する。

AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY

以下を参考に作成する。

超簡単!LaravelでS3を利用する手順

ライブラリをインストール

composer require league/flysystem-aws-s3-v3

アップロードする

ルーティングの設定

Route::get('images',  function () {
    return view('images');
});

Route::post('/images/upload', 'User\ImagesController@upload');

viewの設定

アップロード画面

images.blade.php

<form method="post" action="{{ action('ImagesController@store') }}" enctype="multipart/form-data">
    {{ csrf_field() }}
    <p style="margin:20px;">
        <input id="file" type="file" name="image" />
    </p>
    <input type="submit" value="アップロード" style="margin:20px;"/>
</form>

controllerの設定

<?php

namespace App\Http\Controllers;

use Storage;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class ImagesController extends Controller
{
    
    public function upload(Request $request)
    {
        $params = $request->validate([
            'image' => 'required|file|image',
        ]);

        $image = $request->file('image');

        //第一引数はファイルの保存先のパス。「my_images/」配下に保存される
        //第二引数は画像ファイル
        //第三引数は外部からのアクセスの可否。publicにすると許可される
        $path = Storage::disk('s3')->putFile('my_images', $image, 'public');

        //アップロード先のファイルパスを取得
        $url = Storage::disk('s3')->url($path);
       
        return redirect()->action('ImagesController@index');
    }

}

アップした画像を表示

アップした画像を表示するのは簡単です。

下記でファイルパスが取得できます。
ファイルパスはs3からの相対パスで設定します。

Storage::disk('s3')->url(ファイルパス);

メソッド

メソッド 説明
Storage::disk('s3')->exists(ファイルパス) 対象のファイルが存在するかの確認
Storage::disk('s3')->url(ファイルパス); 保存したファイルの絶対バスが取得できる
Storage::disk('s3')->get(ファイルパス); 画像データを取得
Storage::disk('s3')->put('ファイルパス',ファイルデータ,'公開設定'); ファイルのアップロード