【Laravel】ファイルアップロードに関する忘備録【UploadedFile】

えび

Laravelで画像を扱うときによく使用するUploadedFileに関して
よく使う事項などをメモ書きとして残しておく

まずはstorage:linkしておく

  • ファイルをstorageに保存する場合は、最初にシンボリックリンクを貼る作業が必要
php artisan storage:link

フォームで選択されたファイルをControllerに渡す

  • ルーティングが下記の場合
Route::post('/upload', [\App\Http\Controllers\FileController::class, 'upload'])->name('upload');;
  • formタグでsubmitする場合
<form method="POST" action="{{ route('upload') }}" enctype="multipart/form-data">
  @csrf
  <input type="file" name="file" />
  <button>アップロード</button>
</form>
  • ajaxで渡す場合
<script>
function upload(event) {
  let files = event.target.files || event.dataTransfer.files
  let file = files[0]
  let formData = new FormData()
  formData.append('file', file)
  
  fetch('/upload', {
    method: 'POST',
    body: formData,
  }).then(function (response) {
    return response.clone().json()
  }).then(function (json) {
   if (json.status === 'ok') {
       // アップ完了時の処理
   }
  }).catch((error) => {
    console.error('Error:', error)
  })
}
</script>

ajaxの場合はCORS問題があるので、ルーティングはroutes/api.phpの方に記載する

Controller側で受け取ってアップロードする

<?php

namespace App\Http\Controllers;

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

class FileController extends Controller
{
    /**
     * 画像アップロード
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function upload(Request $request)
    {
        // ファイルを受け取って一意の名前をつける
        $file = $request->file('file');
        $filename = now()->format('YmdHis') . uniqid('', true) . "." . $file->extension();
        // storageに保存
        $path = $file->storeAs('uploaded/', $filename, 'public');

        // ステータスとアップロード先のURLを返却する
        return response()->json([
            'status' => 'ok',
            'path' => Storage::url($path),
        ]);
    }
}

UploadedFileから諸々の情報を取得する

  • 元々のファイル名
$original_name = $request->file('file')->getClientOriginalName();
  • ファイルのタイプ
$type = $request->file('file')->getMimeType();

似たようなメソッドでgetClientMimeType()もあるが、
こっちはファイルの拡張子を見ているだけなので使わない

アップロードされたファイルが画像かどうかチェックする

//*** PHP8以降の場合 ***//
if(str_contains($request->file('file')->getMimeType(),'image')) {
  // 画像の場合の処理
}

//*** PHP8以前の場合 ***//
if (strpos($request->file('file')->getMimeType(), 'image') !== false) {
    // 画像の場合の処理
}

随時加筆予定・・

\ 案件のご依頼・ご相談はこちらから /