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への書き込みと読み込みができます。便利ですね。
コメント