Documents

Laravel8からS3に画像をアップロードする


流れからすると、こんな感じになります。

  • アップローダーUIを作る(blade formのみ)
  • アップローダーUIを作る(blade Drag&Drop版)
  • コントローラを作る
  • ストレージを設定する / アップロードしてみる
  • ストレージをS3に変更する
  • アップロードファイルの更新/削除の実装

Laravelのファイルストレージシステムは非常によくできていると同時にややこしい。(いや、ややこしくはない) というのは、非公開のファイルというものがごく頻繁にあるということを想定して、公開されるべきものとクローズドなものとを区別しつつ管理できるようになっている。アップロードしたファイルが会員しかアクセスできないものとなれば、扱いはややセンスティブになる。

// app/routes/web.php
/**
 * uploader
 */
Route::get('/uploader', [App\Http\Controllers\UploadController::class, 'index'])->name('uploader_index');
Route::post('/upload', [App\Http\Controllers\UploadController::class, 'upload'])->name('upload');
$ ./vendor/bin/sail artisan make:controller UploadController

app/Http/Controllers/UploadController.php が作成されました。

// app/app/Http/Controllers/UploadController.php
public function index()
  {
    return view('uploader/index');
  }

  /**
   * upload request
   */
  public function upload(Request $request)
  {
    /**
     * get files
     */
    $file = $request->file('a');
    date_default_timezone_set('Asia/Tokyo');
    /* get file name */
    $originalName = $file->getClientOriginalName();
    $micro = explode(" ", microtime());
    var_dump($originalName);
    var_dump($micro);
    $dir = 'upFiles';
    $file->storeAs($dir, $originalName, ['disk' => 'local']);

    return view('uploader/upload');
  }

S3をあらかじめ作っておきます。

league/flysystem-aws-s3-v3
thephpleague/flysystem-aws-s3-v3

エラーになっちゃうけど、これで解決(2022-07-17現在) 最新版は自身で確認してください。

$ php composer.phar require league/flysystem-aws-s3-v3:^1.0

公式ドキュメントはこちら。
Aws S3 (v3) Adapter

AWS_ACCESS_KEY_ID=アクセスキー
AWS_SECRET_ACCESS_KEY=シークレットキー
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=バケット名
AWS_URL=https://s3-ap-northeast-1.amazonaws.com/バケット名



2022.03.25