LaravelのStorageを使ってS3に書き込み・読み込みするサンプル

スポンサーリンク

Laravelのファイルストレージシステムは、Storageファサードを通してローカルもS3も同じようにストレージとして扱える便利機能です。

今回はその練習を兼ねて、フォームからPOSTされた文字列をAWS S3のファイルに書き込みと、それを読み込んで表示するごく簡単なサンプルを作ってみました。

必要な準備

  • AWSで何らかのバケットを用意
  • AWSで自分のIAMユーザーのアクセスキーを作成
  • 使用するIAMユーザーが用意したバケットに読み書きできる

実装

まず事前に必要パッケージをインストールします。
(バージョン指定は公式ドキュメントに書かれていたもの)

# S3ドライバインストール
composer require league/flysystem-aws-s3-v3 "~1.0"
# キャッシュアダプタインストール
composer require league/flysystem-cached-adapter "~1.0"

ちなみにartisan serveを起動している場合パッケージインストール後に起動し直さないとエラーになる気がします。

.envのAWS関連の変数4つを設定します。

AWS_ACCESS_KEY_ID=[AWSのアクセスキー ID]
AWS_SECRET_ACCESS_KEY=[AWSのシークレットアクセスキー]
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=[バケット名]

ちなみにこれらの環境変数が読まれる先の設定ファイルはconfig/filesystem.phpにあります。

routes/web.phpにルート追加

Route::get('/s3', 'S3Controller@index');
Route::post('/s3', 'S3Controller@store');

/s3にフォームとファイルの中身を表示して、POSTするとS3に書き込まれてまた/s3に戻るというだけの、昔の掲示板みたいな構成にします。

app/Http/Controllers/S3Controller.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class S3Controller extends Controller
{
    public function index()
    {
        // 存在確認
        if (Storage::disk('s3')->exists('hoge.txt')) {
            $data = Storage::disk('s3')->get('hoge.txt');
        } else {
            // 無いときはとりあえず空文字列
            $data = '';
        }
        return view('s3.index', compact('data'));
    }

    public function store(Request $request)
    {
        // 入力取得
        $text = $request->input('text');
        // S3のファイルに書き込み
        Storage::disk('s3')->put('hoge.txt', $text);
        return redirect('/s3');
    }
}

resources/views/s3/index.blade.php

<form action="/s3" method="post">
    @csrf
    <input type="text" name="text">
    <input type="submit">
</form>
<hr>
{{ $data }}

書き込むフォームとその下に書き込まれた中身を表示しているだけの単純なページです。
ちなみに@csrfを忘れると419 Page Expiredになります…。

こんな感じでS3への書き込みと読み込みができます。便利ですね。

コメント

タイトルとURLをコピーしました