Documents

Laravel8でファイルのアップローダーを作成する


Laravelのフレームワークが優秀すぎてプロトタイプ的なものであるならば数分できます。とはいえ、フレームワークならではのルールがあるので、それを整理しておきます。ファイルをアップするフォーム自体はGETでよく、実際のアップローダーではPOST送信となります。しかしajaxの非同期通信を前提とするとルーティングの方法もまた違ってくるので、ここではもっとも簡易的なものを想定することしています。
必要なものはGETとPOSTのルーティング、そのコントローラとbladeのテンプレートファイルです。追加のPackageなどは不要です。

設計

no method url controller blade
1 GET /uploader UploadController:uploader /upload/uploader.blade.php
1 POST /save UploadController:save /upload/save.blade.php

ルーティングはアップローダーの画面とアップロードファイルを受けて保存してから表示する画面があればよいでしょう。ajaxでやる場合はGET/POSTの両方で受けれるようにして一枚のページでよいと思います。

// app/routes/web.php
Route::get('/uploader', [App\Http\Controllers\UploadController::class, 'uploader'])->name('uploader');
Route::post('/save', [App\Http\Controllers\UploadController::class, 'save'])->name('upload_save');

コントローラはartisanコマンドで作成します。

$ ./vendor/bin/sail artisan make:controller UploadController

app/Http/Controllers/UploadController.php が作成されました。
中身はこんな感じです。変数なんかは端折って固定値でやってます。

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

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

  return view('uploader/save');
}
...

アップローダーはCSRFトークンの設定を忘れずに。

<!-- app/resources/views/uploader/uploader.blade.php -->
...
<form action="/save" method="post"  enctype="multipart/form-data">
  @csrf
  <input type="file" name="a" >
  <input type="submit" >
</form>
...

これで一応できてしまいます。しかし、これだけだとアップロードした画像などを表示できない仕組みになってます。表示させるには、以下のartisanコマンドを実行します。

$ ./vendor/bin/sail artisan storage:link
The [/var/www/html/public/storage] link has been connected to [/var/www/html/storage/app/public].
The links have been created.

/storage/app/publicの中身がDocumentRoot内の/public/storageにリンクされます。アップロードした画像はexample.com/storage/xxx.jpgで見れるようになります。

php artisan storage:link



2022.03.25